Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用MvcMailer发送HTML电子邮件时将CSS与PreMailer.Net内联移动_C#_Css_Email_Mvcmailer_Premailer - Fatal编程技术网

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

C# 如何在使用MvcMailer发送HTML电子邮件时将CSS与PreMailer.Net内联移动,c#,css,email,mvcmailer,premailer,C#,Css,Email,Mvcmailer,Premailer,使用,问题是我们的电子邮件发送时没有使用CSS作为内联样式属性 是一个C#库,它可以读入HTML源字符串,并返回一个带有CSS的结果HTML字符串 我们如何一起使用它们?使用中的脚手架示例,我们从UserMailer-Mailer类中的示例方法开始: public virtual MvcMailMessage Welcome() { return Populate(x => { x.ViewName = "Welcome"; x.To.Add("so

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

是一个C#库,它可以读入HTML源字符串,并返回一个带有CSS的结果HTML字符串

我们如何一起使用它们?使用中的脚手架示例,我们从UserMailer-Mailer类中的示例方法开始:

public virtual MvcMailMessage Welcome()
{
    return Populate(x => {
        x.ViewName = "Welcome";
        x.To.Add("some-email@example.com");
        x.Subject = "Welcome";
    });
}
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;
}
只需通过NugGet安装即可

更新邮件程序类:

public virtual MvcMailMessage Welcome()
{
    return Populate(x => {
        x.ViewName = "Welcome";
        x.To.Add("some-email@example.com");
        x.Subject = "Welcome";
    });
}
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);
注意:即使你认为你不在乎文本,它也能帮助你过滤垃圾邮件

我建议阅读,以便更好地了解正在发生的事情,因为所有这些
Populate
方法都会让人困惑

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

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

如果使用(),可以执行以下操作:

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);
}
邮件发送时受保护的覆盖无效(邮件发送上下文)
{
if(context.Mail.IsBodyHtml)
{
var inlineResult=PreMailer.Net.PreMailer.MoveCssInline(context.Mail.Body);
context.Mail.Body=inlineResult.Html;
}
for(var i=0;i

如果您不喜欢使用
AngleSharp.Network.MimeTypeNames
,您可以使用
“text/html”
。AngleSharp是ActionMailer.Net的一个依赖项。

它可能正在为这条路径而挣扎?我的css被加载到页面中(通过一个带有样式标签内容的分部)。但是如果您不想这样做,您应该能够使用
MoveCssInline
上的css参数来指定样式表-您试过了吗?您的意思是将css作为字符串传递?但是如果我将文本和html作为备用视图,该怎么办?