using Microsoft.Extensions.Logging; using System; using System.Net.Mail; using System.Text; using System.Threading; using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Collections; using zero.Core.Entities; using zero.Core.Extensions; namespace zero.Core.Mails { public class MailSender : IMailSender { protected IMailTemplatesCollection Collection { get; set; } protected SmtpClient Client { get; set; } protected ILogger Logger { get; set; } protected IZeroContext Zero { get; set; } private Encoding encoding = Encoding.UTF8; public MailSender(IZeroContext zero, IMailTemplatesCollection collection, ILogger logger) { Zero = zero; Collection = collection; Logger = logger; Client = new SmtpClient(); } /// //public virtual async Task Create(string mailTemplateKey, CancellationToken token = default) //{ // IMailTemplate template = await GetMailTemplate(mailTemplateKey); // if (template == null) // { // Logger.LogError("Could not find a mail template with the key {key}", mailTemplateKey); // return null; // } // MailMessage message = new MailMessage(); // // get sender from template or fall back to application // message.From = message.Sender; // message.Sender = new MailAddress(template.SenderEmail.Or(Zero.App.Email), template.SenderName.Or(Zero.App.FullName), encoding); // message.ReplyToList.Add(message.From); // // cc + bcc (multiple addresses are separated with commas // if (!template.Cc.IsNullOrWhiteSpace()) // { // message.CC.Add(template.Cc); // } // if (!template.Bcc.IsNullOrWhiteSpace()) // { // message.Bcc.Add(template.Bcc); // } // // recipient // if (!template.RecipientEmail.IsNullOrWhiteSpace()) // { // message.To.Add(template.RecipientEmail); // } // // subject // message.Subject = template.Subject; // message.SubjectEncoding = encoding; //} /// public virtual async Task Send(string mailTemplateKey, Mail message, CancellationToken token = default) { message.Template = await GetMailTemplate(mailTemplateKey); if (message.Template == null) { Logger.LogError("Could not find a mail template with the key {key}", mailTemplateKey); return false; } return await Send(message, token); } /// public virtual async Task Send(Mail message, CancellationToken token = default) { await Task.Delay(0); return true; } /// public virtual async Task Send(MailMessage message, CancellationToken token = default) { try { await Client.SendMailAsync(message, token); return true; } catch (Exception ex) { Logger.LogError(ex, "Could not send mail message via SmtpClient"); return false; } } /// protected virtual async Task GetMailTemplate(string key) { return await Collection.GetByKey(key); } } }