首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将CSS与PreMailer.Net内联移动,同时使用MvcMailer发送MvcMailer电子邮件

如何将CSS与PreMailer.Net内联移动,同时使用MvcMailer发送MvcMailer电子邮件
EN

Stack Overflow用户
提问于 2014-04-04 16:20:43
回答 3查看 5.3K关注 0票数 4

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

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

我们怎么把它们一起用呢?使用MvcMailer逐步指南中的脚手架示例,我们从UserMailer Mailer类中的这个示例方法开始:

代码语言:javascript
复制
public virtual MvcMailMessage Welcome()
{
    return Populate(x => {
        x.ViewName = "Welcome";
        x.To.Add("some-email@example.com");
        x.Subject = "Welcome";
    });
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-04 16:20:43

只需通过PreMailer.Net安装NugGet

更新Mailer类:

代码语言:javascript
复制
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;
}

完成了!

票数 8
EN

Stack Overflow用户

发布于 2016-08-25 02:58:32

如果您有一个以HTML作为备用视图的文本主体(我建议这样做),则需要执行以下操作:

代码语言:javascript
复制
  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文件。

票数 3
EN

Stack Overflow用户

发布于 2017-09-27 09:05:37

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

代码语言:javascript
复制
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的一个依赖项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22868022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档