如何在使用 MvcMailer 发送 HTML 电子邮件时将 CSS 与 PreMailer.Net 内联

本文关键字:CSS PreMailer 内联 Net 电子邮件 HTML 发送 MvcMailer | 更新日期: 2023-09-27 17:56:45

使用MvcMailer,问题是我们的电子邮件在没有CSS作为内联样式属性的情况下发送。

PreMailer.Net 是一个 C# 库,可以读取 HTML 源字符串,并返回带有内联 CSS 的结果 HTML 字符串。

我们如何将它们一起使用?使用 MvcMailer 分步指南中的基架示例,我们从 UserMailer Mailer 类中的此示例方法开始:

public virtual MvcMailMessage Welcome()
{
    return Populate(x => {
        x.ViewName = "Welcome";
        x.To.Add("some-email@example.com");
        x.Subject = "Welcome";
    });
}

如何在使用 MvcMailer 发送 HTML 电子邮件时将 CSS 与 PreMailer.Net 内联

只需通过NugGet安装 PreMailer.Net

更新邮件程序类:

public virtual MvcMailMessage Welcome()
{
    var message = Populate(x => {
        x.ViewName = "Welcome";
        x.To.Add("some-email@example.com");
        x.Subject = "Welcome";
    });
    message.Body = PreMailer.Net.PreMailer.MoveCssInline(message.Body).Html;
    return message;
}

做!

如果你有一个带有HTML作为替代视图的文本正文(我推荐),你需要执行以下操作:

  var message = Populate(m =>
  {
       m.Subject = subject;
       m.ViewName = viewName;
       m.To.Add(model.CustomerEmail);
       m.From = new System.Net.Mail.MailAddress(model.FromEmail);
   });
   // get the BODY so we can process it
   var body = EmailBody(message.ViewName);
   var processedBody = PreMailer.Net.PreMailer.MoveCssInline(body, true).Html;
   // start again with alternate view
   message.AlternateViews.Clear();
   // add BODY as alternate view 
   var htmlView = AlternateView.CreateAlternateViewFromString(processedBody, new ContentType("text/html"));
   message.AlternateViews.Add(htmlView);
   // add linked resources to the HTML view
   PopulateLinkedResources(htmlView, message.LinkedResources);

注意:即使您认为自己不关心文本,它也可以帮助您过滤垃圾邮件。

我建议阅读MailerBase的源代码,以更好地了解发生了什么,因为所有这些Populate方法都会令人困惑。

注意:这可能不会按原样运行,但您明白了。我有代码(未显示)可以解析任何 img 标签并添加为自动附件。

重要的部分是清除 HTML 备用视图。文本视图必须具有.text.cshtml文件。

如果您使用的是 ActionMailer.Net.Next ),则可以这样做:

protected override void OnMailSending(MailSendingContext context)
{
    if (context.Mail.IsBodyHtml)
    {
        var inlineResult = PreMailer.Net.PreMailer.MoveCssInline(context.Mail.Body);
        context.Mail.Body = inlineResult.Html;
    }
    for (var i = 0; i < context.Mail.AlternateViews.Count; i++)
    {
        var alternateView = context.Mail.AlternateViews[i];
        if (alternateView.ContentType.MediaType != AngleSharp.Network.MimeTypeNames.Html) continue;
        using (alternateView) // make sure it is disposed
        {
            string content;
            using (var reader = new StreamReader(alternateView.ContentStream))
            {
                content = reader.ReadToEnd();
            }
            var inlineResult = PreMailer.Net.PreMailer.MoveCssInline(content);
            context.Mail.AlternateViews[i] = AlternateView.CreateAlternateViewFromString(inlineResult.Html, alternateView.ContentType);
        }
    }
    base.OnMailSending(context);
}

如果你不喜欢使用AngleSharp.Network.MimeTypeNames,你可以只使用"text/html"。AngleSharp是 ActionMailer.Net 的依赖