private void TemplateParameterPopulator(EmailTemplateProcessor processor) { var jTemplate = new JObject(); foreach (var item in processor.Items) { string n = item.GetType().Name; if (n.EndsWith("Model")) { n = n.Substring(0, n.Length - "Model".Length); } else if (n.EndsWith("Object")) { n = n.Substring(0, n.Length - "Object".Length); } jTemplate.Add(n, Newtonsoft.Json.Linq.JObject.Parse(JsonConvert.SerializeObject(item))); } // walk through the injected custom parameters, if any if (processor.CustomParameters != null) { //remove any subject or body parameters that are also in the custom parameters processor.SubjParameters.RemoveWhere(c => processor.CustomParameters.Keys.Contains(c)); processor.BodyParameters.RemoveWhere(c => processor.CustomParameters.Keys.Contains(c)); foreach (var item in processor.CustomParameters.Where(c => !string.IsNullOrWhiteSpace(c.Value))) { processor.Template.UpdateSubject(processor.Template.Subject.Replace("{" + item.Key + "}", item.Value)); processor.Template.UpdateText(processor.Template.Text.Replace("{" + item.Key + "}", item.Value)); } } // walk through the injected Items for the subject foreach (var key in processor.SubjParameters) { var token = jTemplate.SelectToken(key); if (token != null) { processor.Template.UpdateSubject(processor.Template.Subject.Replace("{" + key + "}", token.ToString())); } else { processor.AddError($"Value for subject parameter '{key}' is null"); } } // walk through the injected Items for the body foreach (var key in processor.BodyParameters) { var token = jTemplate.SelectToken(key); if (token != null) { processor.Template.UpdateText(processor.Template.Text.Replace("{" + key + "}", token.ToString())); } else { processor.AddError($"Value for html/body parameter '{key}' is null"); } } }
public bool TryProcessTemplate(out EmailTemplateProcessor processor, EmailTemplateId templateId, Dictionary <string, string> parameters, params object[] items) { var t = this.DataManager.GetEmailTemplate(templateId); processor = null; if (t == null) { processor = new EmailTemplateProcessor("No template found for: " + templateId.ToString()); } else { var url = this.BaseUrl(); if (parameters == null) { parameters = new Dictionary <string, string>(); } UserModel user = null; if (items != null && items.Length > 0) { user = items.FirstOrDefault(c => c is UserModel) as UserModel; } //DisplayName is used in emails as a safety valve to identify who the user is... if (user != null) { parameters.TryAdd("DisplayName", user.Name ?? string.Empty); } else { parameters.TryAdd("DisplayName", ""); } parameters.TryAdd("HomeUrl", url); parameters.TryAdd("LoginUrl", url + "login"); parameters.TryAdd("SignupUrl", url + "signup"); parameters.TryAdd("LogoUrl", url + "statics/logo.png"); parameters.TryAdd("PhishingUrl", url + "phishing"); //get the html containing the master layout for all emails //string layout = string.Copy( this.DataManager.EmailLayout.Text ); //processor = new EmailTemplateProcessor( t, layout, parameters, items ); processor = new EmailTemplateProcessor(t, parameters, items); //var matches = Regex.Matches("Test {Token1} {Token 2}", @"{([^{}]*)"); var regex = new System.Text.RegularExpressions.Regex(@"{([^{}]*)", System.Text.RegularExpressions.RegexOptions.Multiline); try { TemplateParameterDiscoverer(regex.Match(processor.Template.Subject), processor.SubjParameters); } catch (Exception ex) { processor.AddError("Error parsing subject parameters: " + ex.ToString()); } try { TemplateParameterDiscoverer(regex.Match(processor.Template.Text), processor.BodyParameters); } catch (Exception ex) { processor.AddError("Error parsing html parameters: " + ex.ToString()); } try { TemplateParameterPopulator(processor); } catch (Exception ex) { processor.AddError("Error populating parameters: " + ex.ToString()); } } return(processor.Successful); }