public virtual async Task <SendEmailResult> SendEmailTemplateAsync <TTemplate>(TTemplate parameters) where TTemplate : EmailTemplate { if (parameters is null) { throw new ArgumentNullException(nameof(parameters), "Email template parameters are null"); } var emailTemplateType = parameters.GetType(); var emailTemplate = EmailTemplateRepo.GetByType(emailTemplateType); if (emailTemplate == null) { new NullReferenceException($"Could not find email template by type {emailTemplateType.FullName}"); } // check if this is a simulation if (parameters.Simulate) { return new SendEmailResult { Status = "sent", Server = "Simulation", ServerUsername = "******", EmailAddress = parameters.RecipientEmailAddress, EmailSubject = emailTemplate.EmailSubject } } ; // check if this is a distributed email var isDistributedEmailList = parameters.RecipientEmailAddress.Contains(";"); if (isDistributedEmailList) { var results = await SendDistributionEmailAsync( parameters.RecipientEmailAddress, emailTemplate.TemplateId, parameters, parameters.Test); return(results.FirstOrDefault()); } // send email using the provider implementation return(await SendEmailAsync(parameters.RecipientEmailAddress, emailTemplate.TemplateId, parameters, parameters.Test)); }
public override async Task <SendEmailResult> SendEmailAsync <TModel>(string emailAddress, string templateId, TModel model, bool test) { // convert the model's public properties to a dictionary var mergeParameters = model.GetPropertiesDictionary(); // prefix subject with environment name mergeParameters["Environment"] = SharedOptions.IsProduction() ? "" : $"[{SharedOptions.Environment}] "; // get template var emailTemplateInfo = EmailTemplateRepo.GetByTemplateId(templateId); var htmlContent = File.ReadAllText(emailTemplateInfo.FilePath); // parse html var parser = new HtmlParser(); var document = parser.ParseDocument(htmlContent); // remove the meta data comments from the document var templateMetaData = document.Descendents <IComment>().FirstOrDefault(); if (templateMetaData == null) { new NullReferenceException(nameof(templateMetaData)); } templateMetaData.Remove(); var messageSubject = emailTemplateInfo.EmailSubject; var messageHtml = document.ToHtml(); var messageText = document.Text(); // merge the template parameters foreach ((string name, object value) in mergeParameters) { messageSubject = messageSubject.Replace($"(({name}))", value.ToString()); messageHtml = messageHtml.Replace($"(({name}))", value.ToString()); } var smtpServer = string.IsNullOrWhiteSpace(Options.Server) ? Options.Server2 : Options.Server; var smtpServerPort = Options.Port <= 0 ? Options.Port2 : Options.Port; var smtpUsername = string.IsNullOrWhiteSpace(Options.Username) ? Options.Username2 : Options.Username; var smtpPassword = string.IsNullOrWhiteSpace(Options.Password) ? Options.Password2 : Options.Password; await Email.QuickSendAsync( messageSubject, Options.SenderEmail, Options.SenderName, Options.ReplyEmail, emailAddress, messageHtml, smtpServer, smtpUsername, smtpPassword, smtpServerPort, test : test); return(new SendEmailResult { Status = "sent", Server = $"{smtpServer}:{smtpServerPort}", ServerUsername = smtpUsername, EmailAddress = emailAddress, EmailSubject = messageSubject, EmailMessagePlainText = messageText }); }