/// <summary> /// 加载Email模板 /// </summary> private static Dictionary <string, EmailTemplate> LoadEmailTemplates() { Dictionary <string, EmailTemplate> emailTemplates; //todo:zhengw,by libsh:需要确定如果获取当前语言 //回复:暂不修改 string language = "zh-CN"; string cacheKey = "EmailTemplates::" + language; ICacheService cacheService = DIContainer.Resolve <ICacheService>(); emailTemplates = cacheService.Get <Dictionary <string, EmailTemplate> >(cacheKey); if (emailTemplates == null) { emailTemplates = new Dictionary <string, EmailTemplate>(); // Read in the file string searchPattern = "*.xml"; //平台级邮件模板 string commonDirectoryPath = WebUtility.GetPhysicalFilePath(string.Format("~/Languages/" + language + "/emails/")); string[] fileNames = Directory.GetFiles(commonDirectoryPath, searchPattern); //应用级邮件模板 string applicationsRootDirectory = WebUtility.GetPhysicalFilePath("~/Applications/"); IEnumerable <string> applicationEmailTemplateFileNames = new List <string>(); if (Directory.Exists(applicationsRootDirectory)) { foreach (var applicationPath in Directory.GetDirectories(applicationsRootDirectory)) { string applicationEmailTemplateDirectory = Path.Combine(applicationPath, "Languages\\" + language + "\\emails\\"); if (!Directory.Exists(applicationEmailTemplateDirectory)) { continue; } applicationEmailTemplateFileNames = applicationEmailTemplateFileNames.Union(Directory.GetFiles(applicationEmailTemplateDirectory, searchPattern)); } } //为提升Linq执行效率,尽量避免在循环体中使用立即执行方法,比如:.ToArray() fileNames = fileNames.Union(applicationEmailTemplateFileNames).ToArray(); dynamic dModel = new ExpandoObject(); Type modelType = ((object)dModel).GetType(); foreach (string fileName in fileNames) { if (!File.Exists(fileName)) { continue; } XmlDocument doc = new XmlDocument(); doc.Load(fileName); string templateName; foreach (XmlNode node in doc.GetElementsByTagName("email")) { XmlNode attrNode = node.Attributes.GetNamedItem("templateName"); if (attrNode == null) { continue; } templateName = attrNode.InnerText; EmailTemplate emailTemplate = new EmailTemplate(node); emailTemplates[templateName] = emailTemplate; //编译模板 if (!string.IsNullOrEmpty(emailTemplate.Body)) { Razor.Compile(emailTemplate.Body, modelType, templateName); } } } cacheService.Add(cacheKey, emailTemplates, CachingExpirationType.Stable); } return(emailTemplates); }
/// <summary> /// 生成MailMessage /// </summary> /// <param name="templateName">邮件模板名称</param> /// <param name="model">解析模板使用的数据</param> /// <param name="from">发件人</param> /// <param name="to">收件人</param> /// <param name="cc">抄送地址</param> /// <param name="bcc">密送地址</param> /// <exception cref="CommonExceptionDescriptor">发件人不能为null</exception> /// <exception cref="CommonExceptionDescriptor">编译邮件模板标题时报错</exception> /// <exception cref="CommonExceptionDescriptor">编译邮件模板内容时报错</exception> /// <exception cref="CommonExceptionDescriptor">邮件模板中Body、BodyUrl必须填一个</exception> /// <returns>返回生成的MailMessage</returns> public MailMessage Resolve(string templateName, dynamic model, IEnumerable <string> to, string from = null, IEnumerable <string> cc = null, IEnumerable <string> bcc = null) { if (to == null) { return(null); } if (model == null) { model = new ExpandoObject(); } IEmailSettingsManager emailSettingsManager = DIContainer.Resolve <IEmailSettingsManager>(); EmailSettings settings = emailSettingsManager.Get(); //if (settings.SmtpSettings.ForceSmtpUserAsFromAddress) // from = settings.SmtpSettings.UserEmailAddress; EmailTemplate emailTemplate = GetEmailTemplate(templateName); if (string.IsNullOrEmpty(from)) { if (string.Equals(emailTemplate.From, "NoReplyAddress", StringComparison.CurrentCultureIgnoreCase)) { from = settings.NoReplyAddress; } else if (string.Equals(emailTemplate.From, "AdminAddress", StringComparison.CurrentCultureIgnoreCase)) { from = settings.AdminEmailAddress; } else { throw new ExceptionFacade(new CommonExceptionDescriptor("发件人不能为null")); } } MailMessage email = new MailMessage(); email.IsBodyHtml = true; try { //todo all by bianchx:为了保证发送出去的邮件发送人名称显示都是相同的,所以需要保证Model中的SiteName都是有效的 email.From = new MailAddress(from, model.SiteName); } catch { } foreach (var toAddress in to) { try { email.To.Add(toAddress); } catch { } } if (cc != null) { foreach (var ccAddress in cc) { try { email.CC.Add(ccAddress); } catch { } } } if (bcc != null) { foreach (var bccAddress in bcc) { try { email.Bcc.Add(bccAddress); } catch { } } } //使用RazorEngine解析 EmailTemplate.Subject try { email.Subject = Razor.Parse(emailTemplate.Subject, model, emailTemplate.TemplateName); } catch (Exception e) { throw new ExceptionFacade(new CommonExceptionDescriptor("编译邮件模板标题时报错"), e); } email.Priority = emailTemplate.Priority; if (!string.IsNullOrEmpty(emailTemplate.Body)) { try { email.Body = Razor.Parse(emailTemplate.Body, model, emailTemplate.Body); } catch (Exception e) { throw new ExceptionFacade("编译邮件模板内容时报错", e); } } else if (!string.IsNullOrEmpty(emailTemplate.BodyUrl)) { email.Body = HttpCollects.GetHTMLContent(emailTemplate.BodyUrl); } else { throw new ExceptionFacade("邮件模板中Body、BodyUrl必须填一个"); } return(email); }