存储电子邮件模板的位置

Ela*_*hmi 8 .net asp.net email-templates

我有一个asp.net Web应用程序,它在注册过程中向用户发送几封电子邮件.现在我让它们与代码内联,但我想把它们放在一个中心位置,我可以编辑它们而无需进入VS.

存储这些HTML模板的最佳位置/格式是什么?

Mar*_*nHN 14

我将我的web-app的所有电子邮件模板存储为ASP.NET MVC Razor Views,但作为轻量级程序集中的嵌入式资源,我可以从任何项目轻松引用.

模板看起来像这样(注意本地化):

@model Milkshake.Commerce.Model.Users.UserDto
@using Milkshake.Core.Internationalization;
@using Milkshake.Commerce.Model.Meta;

@if (Language.CurrentForInterface.TwoLetterISOLanguageName.Equals("da"))
{

<h1>Hej @Model.FirstName</h1>

<p>
    Din nye brugerkonto til Milkshake Commerce er blevet oprettet.
</p>

<p>
    Gå til dine <a href="http://@ShopSettings.Instance.Domain.TrimEnd('/')/Account">konto indstillinger</a>, brug din e-mail adresse som adgangskode og du vil blive videreført til dine konto indstillinger, hvor du kan ændre din adgangskode.
</p>

<p>Ha' en god dag!</p>
<h2>The Milkshake Commerce Team!</h2>

}
else
{

<h1>Hi @Model.FirstName</h1>

<p>
    Your new user account for Milkshake Commerce has been created for you.
</p>

<p>
    Go to your <a href="http://@ShopSettings.Instance.Domain.TrimEnd('/')/Account">user account page</a>, use your e-mail address as password and you'll be taken directly to your account page where you can change your password.
</p>

<p>Have a nice day!</p>
<h2>The Milkshake Commerce Team!</h2>

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个"主"模板,名为_AppEmailTemplate.cshtml:

@using Milkshake.Commerce.Model.Resources

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>

<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <title></title>

        <style type="text/css">
            body
            {
                font-family: Arial, Helvetica;
            }
            .layout-wrapper
            {
                width: 600px;
            }
            .header
            {
                background-color: #242225;
            }
            .header img
            {
                display: block;
            }
            .content
            {
                background-color: #ffffff; padding: 10px 20px; border: 10px solid #eaeaea; border-top: none;
            }
            .footer
            {
                padding: 20px; padding-top: 5px; font-size: 10px; color: #cccccc;
            }
            p
            {
                font-size: 14px;
            }
            p.company-details
            {
                font-size: 12px;
            }
            h1
            {
                font-size: 20px;
            }
            h2
            {
                font-size: 16px;
            }
        </style>
        <style type="text/css" id="mobile">
            @@media only screen and (max-device-width: 480px) {
                body
                {
                }
                .layout-wrapper
                {
                    width: 480px !important;
                }
                .header
                {
                    background-color: transparent !important;
                }
                .header img
                {
                    width: 480px !important;
                }
                .content
                {
                    border: none !important;
                }
                .footer
                {
                    padding-top: 15px !important;
                }
                p
                {
                    font-size: 22px !important;
                }
                h1
                {
                    font-size: 28px !important;
                }
                h2
                {
                    font-size: 24px !important;
                }
            }
        </style>
    </head>

    <body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0" bgcolor="#f1f1f1">

        <table width="100%" cellpadding="0" cellspacing="0" bgcolor="#f1f1f1">
            <tr>
                <td valign="top" align="center">

                    <table cellpadding="0" cellspacing="0" width="100%" height="80">
                        <tr>
                            <td class="header" align="center">
                                <table cellpadding="0" cellspacing="0" width="600" height="80" class="layout-wrapper" style="width: 600px;">
                                    <tr>
                                        <td>
                                            <img src="http://example.com/email-header.png" alt="Milkshake Commerce" />
                                        </td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </table>

                    <table cellpadding="0" cellspacing="0" width="600" class="layout-wrapper">
                        <tr>
                            <td class="content" align="left">
                                #¤#¤CONTENTSECTION#¤#¤
                            </td>
                        </tr>
                        <tr>
                            <td class="footer" align="left">
                                <p>@Text.appEmailDisclaimer</p>
                                <p>@Text.appEmailFooterAd.UrlDecode()</p>
                                <p class="company-details"><i>Company name etc.</i></p>
                            </td>
                        </tr>
                    </table>

                </td>
            </tr>
        </table>

    </body>

</html>
Run Code Online (Sandbox Code Playgroud)

要实际发送电子邮件,我使用RazorEngine进行渲染:

public void SendSystemEmail<T>(string templateName, string subject, string fromName, string recipientEmail, T model)
{
    dynamic template = this.GetEmailTemplate(templateName);
    string layoutBody = RazorEngine.Razor.Parse(template.Layout as string, model);
    string emailBody = RazorEngine.Razor.Parse(template.Template as string, model);

    emailBody = layoutBody.Replace(CONTENTSECTIONREPLACETOKEN, emailBody);

    PreMailer.Net.PreMailer pm = new PreMailer.Net.PreMailer();
    emailBody = pm.MoveCssInline(emailBody, true);

    EmailDto email = new EmailDto();
    email.Body = emailBody;
    email.IsBodyHtml = true;
    email.FromEmail = "support@example.com";
    email.ReplyToEmail = email.FromEmail;
    email.FromName = fromName;
    email.RecipientEmail = recipientEmail;
    email.Subject = subject;
    email.Type = EmailTypes.Transactional;

    if (String.IsNullOrWhiteSpace(email.FromName))
    {
        email.FromName = "Milkshake Software";
    }

    this.SendMailMessages(new List<EmailDto>() { email }, false);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用我自己的EmailDto对象.在这里,您可以[MailMessage][2]直接轻松创建实例,并使用[SmtpClient][3].

此外,为了在所有电子邮件客户端中获得最佳渲染,我使用自己的PreMailer.Net库来移动所有CSS内联.阅读我的博客文章,了解更多信息.(代码在Github上)

GetEmailTemplate执行此操作:

/// <summary>
/// Gets the email template.
/// </summary>
/// <param name="templateName">Name of the template.</param>
/// <returns>Returns the e-mail template.</returns>
private dynamic GetEmailTemplate(string templateName)
{
    string masterTemplateContents = this.GetTemplateFileContents("_AppEmailTemplate.cshtml");
    string templateContents = this.GetTemplateFileContents(templateName + ".html.cshtml");

    return new { Layout = masterTemplateContents, Template = templateContents };
}

/// <summary>
/// Gets the template file contents.
/// </summary>
/// <param name="templateFileName">The name of the template file.</param>
/// <returns>Returns the contents of the template file.</returns>
private string GetTemplateFileContents(string templateFileName)
{
    return this.GetEmailFileContents("Templates", templateFileName);
}

/// <summary>
/// Gets the email file contents.
/// </summary>
/// <param name="lastNamespaceToken">The last namespace token.</param>
/// <param name="templateFileName">The name of the template file.</param>
/// <returns>
/// Returns the contents of the template file.
/// </returns>
private string GetEmailFileContents(string lastNamespaceToken, string templateFileName)
{
    var assembly = Assembly.GetExecutingAssembly();

    if (assembly != null)
    {
        StringBuilder sb = new StringBuilder();

        using (StreamReader sr = new StreamReader(assembly.GetManifestResourceStream(String.Format("MyApp.BusinessLogic.Communication.{0}.{1}", lastNamespaceToken, templateFileName))))
        {
            while (!sr.EndOfStream)
            {
                var line = sr.ReadLine();

                if (!line.StartsWith("@model"))
                {
                    sb.AppendLine(line);
                }
            }
        }

        return sb.ToString();
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)