/// <summary> /// Sends an email by using an email task object, do not call this method manually as it will take time /// and kill the performance unless it's you want to wait for the email sending to complete /// </summary> /// <param name="emailTask">Email task object</param> /// <exception cref="System.Net.Mail.SmtpException">If the email sending failed</exception> /// <returns>Async task whenever sending the email is done</returns> public async Task ManuallySendEmailAsync(EmailQueuerTask emailTask) { using var scope = factory.CreateScope(); var fluent = scope.ServiceProvider.GetRequiredService <IFluentEmailFactory>(); await SendEmailAsync(emailTask, fluent); }
private async Task SendEmailAsync(EmailQueuerTask emailTask, IFluentEmailFactory fluent) { var data = JsonConvert.DeserializeObject(emailTask.ModelJson, options.Assembly.Assembly.GetType(emailTask.ModelType)); var emails = emailTask.To.Split(";") .Select(e => new FluentEmail.Core.Models.Address { EmailAddress = e }) .ToArray(); FluentEmail.Core.Models.Address[] cc = { }; if (!string.IsNullOrEmpty(emailTask.CC)) { cc = emailTask.CC.Split(";") .Select(e => new FluentEmail.Core.Models.Address { EmailAddress = e }) .ToArray(); } FluentEmail.Core.Models.Address[] bcc = { }; if (!string.IsNullOrEmpty(emailTask.BCC)) { bcc = emailTask.BCC.Split(";") .Select(e => new FluentEmail.Core.Models.Address { EmailAddress = e }) .ToArray(); } var attachmentFileNames = emailTask.AttachmentPaths.Split(";"); var body = await GenerateEmailBody(emailTask.Template, data); var emailToSend = fluent.Create() .To(emails) .CC(cc) .BCC(bcc) .Subject(emailTask.Subject) .Body(body, true); foreach (var attachmentFileName in attachmentFileNames) { if (!string.IsNullOrEmpty(attachmentFileName)) { emailToSend.AttachFromFilename(attachmentFileName); } } await emailToSend.SendAsync(); }