/// <summary> /// Send the email /// /// Looks for templates /// `EmailTemplates/{templateName}(.{languageCode}).Subject.txt` and /// `EmailTemplates/{templateName}(.{languageCode}).Body.html` /// /// In addition to `model` also Option section `EmailPlaceholders` is used /// in placeholders. /// </summary> /// <param name="templateName">Name of the template, </param> /// <param name="languageCode"></param> /// <param name="toEmail"></param> /// <param name="toName"></param> /// <param name="model">Used as placeholders</param> /// <exception cref="IOException">Thrown when the template can't be read</exception> /// <returns></returns> private async Task Send(string templateName, string languageCode, string toEmail, string toName, IEmailModel model) { var props = model.GetType().GetProperties(); var subject = new StringBuilder(""); var body = new StringBuilder(""); var values = new Dictionary <string, string>(); var languageSuffix = languageCode != "" ? $".{languageCode}" : ""; var subjectFileName = Path.Combine(_env.ContentRootPath, "EmailTemplates", $"{templateName}{languageSuffix}.Subject.txt"); var bodyFileName = Path.Combine(_env.ContentRootPath, "EmailTemplates", $"{templateName}{languageSuffix}.Body.html"); if (!File.Exists(subjectFileName) || !File.Exists(bodyFileName)) { _logger.LogError($"Email template `{templateName}` does not exist"); return; } try { using (var bodyFile = File.OpenRead(bodyFileName)) using (var subjectFile = File.OpenRead(subjectFileName)) { subject = new StringBuilder(new StreamReader(subjectFile).ReadToEnd()); body = new StringBuilder(new StreamReader(bodyFile).ReadToEnd()); } } catch (IOException e) { _logger.LogError($"Email template `{templateName}` could not be accessed", e); throw; } foreach (var p in _emailPlaceholders) { values.Add(p.Key.ToLower(), p.Value); } foreach (var p in props) { values.Add(p.Name.ToLower(), p.GetValue(model) as string); } foreach (var v in values) { subject.Replace($"[{v.Key}]", v.Value); body.Replace($"[{v.Key}]", v.Value); } await _emailSender.Send(toEmail, toName, subject.ToString(), body.ToString()); }
public static IEnumerable <EmailMessageEntity> CreateEmailMessage(this IEmailModel emailModel) { if (emailModel.UntypedEntity == null) { throw new InvalidOperationException("Entity property not set on EmailModel"); } using (IsolationEntity.Override((emailModel.UntypedEntity as Entity)?.TryIsolation())) { var emailModelEntity = ToEmailModelEntity(emailModel.GetType()); var template = GetDefaultTemplate(emailModelEntity, emailModel.UntypedEntity as Entity); return(EmailTemplateLogic.CreateEmailMessage(template.ToLite(), model: emailModel)); } }