ASP.NET MVC WebAPI 邮件模板和本地化






4.80/5 (5投票s)
如何使用 Razor 视图作为邮件模板,并使用示例 WebAPI 对其进行本地化
引言
在大多数应用程序中,我们需要向用户发送电子邮件。与其直接从各种应用程序发送电子邮件,不如编写一个 webapi 来执行相同的操作,这样我们就可以调用这个邮件 web API 从任何应用程序发送电子邮件。
在当前示例中,它做了两件事。
- 使用 Razor 视图作为模板来格式化电子邮件正文
- 根据用户偏好本地化电子邮件
在下面的示例中,我尝试使用多个模板以多种语言向用户发送错误列表。我使用 VS2013 开发了这个,源文件已附加到文章中。
Using the Code
步骤 1
创建一个新的 MVC Web API 应用程序,并在控制器中添加一个 API SendMail。该方法实际上接受 JSON 字符串作为输入,并相应地发送电子邮件。 Json 字符串包含 To、CC、BCC 地址列表,要在电子邮件正文中发送的信息,以及主题。 除此之外,它还包含应向用户发送电子邮件的语言环境以及用于格式化电子邮件的模板名称。
 [HttpPost]
        public void SendMail(JToken Payload) {
            try {
                var emailList = Payload.SelectToken("email").ToObject<List<EmailModel>>();
                foreach (var data in emailList) {
                    //Set Culture
                    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(
								data.Locale);
                    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
                    //Localize the body
                    var model = JsonConvert.DeserializeObject<Errors>(data.EmailBody);
                    string template = File.ReadAllText(
                    HttpContext.Current.Server.MapPath("~/Templates/")+data.EmailTemplate+".cshtml");
                    data.EmailBody = Razor.Parse<Errors>(template, model);
                    data.EmailSubject = Razor.Parse("@MyWebAPI.Resources.Language.ErrorEmailTitle");
                    //Send Mail
                    var smtpClient = new SmtpClient("smtp.gmail.com", 587) {
                        Credentials = new NetworkCredential("a@b.com", "password"),
                        EnableSsl = true
                    };
                    MailMessage mail = new MailMessage();
                    mail.From = new MailAddress(data.FromAddress);
                    mail.Subject = data.EmailSubject;
                    mail.Body = data.EmailBody;
                    mail.IsBodyHtml = true;
                    if (!string.IsNullOrEmpty(data.EmailIds))
                        mail.To.Add(data.EmailIds);
                    if (!string.IsNullOrEmpty(data.EmailIdsCC))
                        mail.CC.Add(data.EmailIdsCC);
                    if (!string.IsNullOrEmpty(data.EmailIdsBCC))
                        mail.Bcc.Add(data.EmailIdsBCC);
                    smtpClient.Send(mail);
                }
            } catch (Exception e) {
                //Log Errors
            }
        }
在上面的方法中,Razor.Parse 起着至关重要的作用。 它接受完整的 Razer 视图路径和模型对象,并返回新的 HTML 格式化string。RazorView(.cshtml) 文件充当电子邮件模板来格式化正文。
第二步
为了本地化电子邮件模板,即 RazorView ,我们需要资源文件。 因此,添加与所需语言数量一样多的资源文件。 在这里,我添加了两个带有所有必需短语的资源文件(英语,法语)。

现在添加另一个没有语言环境扩展名的资源文件 (.resx),即 Language.resx。 现在在 Language.Designer.cs 中,添加根据语言环境设置返回短语的方法。
     public static string High
        {
            get
            {
                return ResourceManager.GetString("High", resourceCulture);
            }
        }
        public static string at {
            get {
                return ResourceManager.GetString("at", resourceCulture);
            }
        }
        public static string With {
            get {
                return ResourceManager.GetString("With", resourceCulture);
            }
        }
因此,模板中所需的每个单词都应在此处包含一个方法/属性。 因此,通过在 Razor 视图中调用它,我们将显示数据。
步骤 3
现在设计电子邮件正文的 razor 视图模板。 根据用户偏好,我们将选择合适的模板。 在下面的代码中,我们可以观察到我们正在使用Language 类中的属性/方法来获取本地化的短语。
@using MyWebAPI.Resources;
@using System.Web.WebPages.Razor;
<!DOCTYPE html>
<html>
<head>   
</head>
<body>
    <div>
        <h3>@Model.DisplayCount @Language.New.ToLower() @Language.Errors</h3>
    </div>
    <div class="pmargin">
        <table>
            <tr>
                <th>@Language.Severity</th>
                <th>@Language.Description</th>
                <th>@Language.Timestamp</th>
            </tr>
        @foreach (var error in @Model.ErrorList) {
            <tr>
                <td>@Language.GetSeverityValue(error.Severity)</td>
                <td>@Language.GetDescription(error.Description)</td>
                <td>@error.LastUpdate </td>
            </tr>
        }
    </table>
    <br />
</div>
</body>
</html>
步骤 4
最后,定义一个模型以反序列化用户输入。 在这里,我使用了 JSON 作为 WebApi 的有效负载,并相应地设计了模型。
 public class EmailModel {
        [JsonProperty("fromAddress")]
        public string FromAddress { get; set; }
        [JsonProperty("toAddress")]
        public string EmailIds { get; set; }
        [JsonProperty("subject")]
        public string EmailSubject { get; set; }
        [JsonProperty("body")]
        public string EmailBody { get; set; }
        [JsonProperty("toAddressCC")]
        public string EmailIdsCC { get; set; }
        [JsonProperty("toAddressBCC")]
        public string EmailIdsBCC { get; set; }
        [JsonProperty("emailTemplate")]
        public string EmailTemplate { get; set; }
        [JsonProperty("locale")]
        public string Locale { get; set; }
    }
电子邮件模型用于反序列化用户输入。 在该输入中,电子邮件正文再次包含 JSON string,用于错误列表。 因此,需要多个模型。
  public class Errors {
        [JsonProperty("errors")]
        public List<Error> ErrorList { get; set; }
        [JsonProperty("count")]
        public int DisplayCount { get; set; }
    }
    [Serializable]
    public class Error {
        [JsonProperty("description")]
        public string Description { get; set; }
        [JsonProperty("severity")]
        public string Severity { get; set; }
        [JsonProperty("lastUpdate")]
        public DateTime LastUpdate { get; set; }
    }
如何测试这个 WebAPI?
- 在 IIS 中创建一个网站
- 在 SendMailAPI 中,我使用了 Gmail SMTP,因此请在该方法中使用您的 gmail 凭据。
- 在 Fiddler 中,选择 POST,请求 URL: https://:98/api/Email(使用您在 IIS 中给出的端口号)并使用下面的 json 作为有效负载(将无效的 emailids 替换为一些有效的 emailids 以进行测试)
{
    "email": [
        {
            "fromAddress": "mamatha.neni@gmail.com",
            "toAddress": "a@b.com",
            "subject": "My First WebAPI",
            "body": "{\"errors\":[{\"description\":\"Disconnected\",
            \"severity\":\"high\",\"lastUpdate\":\"2015-04-09T06:30:15.244693+05:30\"},
            {\"description\":\"Disconnected\",\"severity\":\"low\",
            \"lastUpdate\":\"2015-04-08T06:30:15.247193+05:30\"}],\"count\":0}",
            "toAddressCC": "abc@gmail.com",
            "toAddressBCC": "",
            "emailTemplate": "ErrorsTable",
            "locale": "fr-CA"
        },
        {
            "fromAddress": "mamatha.neni@gmail.com",
            "toAddress": "a@b.com",
            "subject": "My First WebAPI",
            "body": "{\"errors\":[{\"description\":\"Disconnected\",
            \"severity\":\"high\",\"lastUpdate\":\"2015-04-09T06:30:15.244693+05:30\"},
            {\"description\":\"Disconnected\",\"severity\":\"low\",
            \"lastUpdate\":\"2015-04-08T06:30:15.247193+05:30\"}],\"count\":0}",
            "toAddressCC": "xy@gmail.com",
            "toAddressBCC": "",
            "emailTemplate": "ErrorsList",
            "locale": "en-US"
        }
    ]
}
关注点
到目前为止,我通过阅读 CodeProject 文章学到了很多东西。 这是我第一次尝试写东西。 所以请浏览一下,如果有任何问题/意见,请回复我。


