使用富文本编辑器(或Razor页面)自定义邮件模板, 后台根据不同数据动态生成邮件内容进行发送


一、自定义邮件模板

 这是一个cshtml后缀的文件,通过该文件定义邮件的内容模板。

@model ApiTest.Models.Order

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>订单邮件模板</title>
    <style>
        .byTable {
            width: 100%;
            border-collapse: collapse;
            padding: 2px;
        }

            .byTable, .byTable tr th, .byTable tr td {
                border: 1px solid black;
                padding: 5px 15px;
                font-size: 16px;
            }
    </style>
</head>
<body>
    <p>RazorEngine!</p>
    <h3>Order Name: @Model.OrderName</h3>
    <h3>Order #: @Model.OrderNo</h3>

    @if (Model.OrderName == "order name")
    {
        <span>PM: @Model.OrderName</span>
    }
    else
    {
        <p>PM: @Model.OrderName</p>
    }

    <h3>订单详情</h3>
    <table class="byTable">
        <tr>
            <td>Item name</td>
            <td>Item #</td>
            <td>Quantity</td>
            <td>Price</td>
            <td>Total</td>
        </tr>
        @foreach (var item in Model.Items)
        {
            <tr>
                <td>@item.ItemName</td>
                <td>@item.ItemNo</td>
                <td>@item.Quantity</td>
                <td>@item.Price</td>
                <td>@item.Total</td>
            </tr>
        }
    </table>
</body>
</html>

二、通过模板解析器解析自定义的邮件模板,动态填充数据

 邮件模板解析器使用RazorEngine进行解析,代码如下:

public class RazorTemplateParser
    {
        public string Parse<T>(string templateContents, T data)
        {
            return HttpUtility.HtmlDecode(ParseTemplate(templateContents, data));
        }

        private string ParseTemplate<T>(string templateContents, T data)
        {
            try
            {
                var templateKey = new NameOnlyTemplateKey(templateContents.GetHashCode().ToString(), ResolveType.Global, null);

                if (!Engine.Razor.IsTemplateCached(templateKey, data.GetType()))
                {
                    Engine.Razor.AddTemplate(templateKey, new LoadedTemplateSource(templateContents));
                }

                var templateOutput = new StringBuilder();
                using (var sw = new StringWriter(templateOutput))
                {
                    Engine.Razor.RunCompile(templateKey, sw, data.GetType(), data);
                }

                return templateOutput.ToString();
            }
            catch (Exception ex)
            {
                throw new Exception("There was an error parsing the email.", ex);
            }
        }
    }

通过如下代码,提取邮件模板内容,填充数据,并调用发送邮件的代码发送邮件:

public void SendEmail()
        {
            var path = AppDomain.CurrentDomain.BaseDirectory + "Templates\\WebPage1.cshtml";
            var template = System.IO.File.ReadAllText(path);

            var model = new Order
            {
                OrderName = "order name",
                OrderNo = "order no",
                OrderDate = DateTime.Now,
                OrderStatus = "in progress",
                Items = new List<OrderItem> {
                    new OrderItem
                    {
                        ItemName = "item name 1",
                        ItemNo="item no 1",
                        Price = 10,
                        Quantity =20
                    },
                    new OrderItem
                    {
                        ItemName = "item name 2",
                        ItemNo="item no 2",
                        Price = 15,
                        Quantity =10
                    }
                }
            };
            var razorParsed = new RazorTemplateParser().Parse(template, model);
            EmailUtils.SendMail(razorParsed);
        }

 

三、发送邮件

如下方法利用SmtpClient对象发送邮件:

public static void SendMail(string oFBody)
        {
            try
            {
                string fromMail = "your email";
                string fromMailPwd = "your password";
                string displayName = "邮件发送服务";
                string toMail = "接收的邮件地址";
                string host = "邮件服务器地址";

                MailMessage mailmsg = new MailMessage();
                mailmsg.From = new MailAddress(fromMail, displayName);
                mailmsg.To.Add(toMail);
                mailmsg.Subject = "Razor engine email test";
                mailmsg.Body = oFBody;
                mailmsg.BodyEncoding = System.Text.Encoding.UTF8;
                mailmsg.IsBodyHtml = true;

                SmtpClient sendmsg = new SmtpClient(host);
                sendmsg.Host = host;
                sendmsg.Credentials = new NetworkCredential(fromMail, fromMailPwd);
                sendmsg.EnableSsl = true;
                sendmsg.Send(mailmsg);
                mailmsg.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }

 
如下是收到的邮件内容截图:

 

posted @ 2021-07-16 16:05  SilverFox8588  阅读(980)  评论(0编辑  收藏  举报