使用MvcMailer,问题是我们的电子邮件是在没有CSS作为内联样式属性的情况下发送的。
PreMailer.Net是一个C#库,可以读取HTML源字符串,并返回带有CSS内联的结果HTML字符串。
我们如何一起使用它们?使用MvcMailer step-by-step guide中的脚手架示例,我们从UserMailer Mailer类中的这个示例方法开始:
public virtual MvcMailMessage Welcome()
{
return Populate(x => {
x.ViewName = "Welcome";
x.To.Add("some-email@example.com");
x.Subject = "Welcome";
});
}
答案 0 :(得分:6)
只需通过NugGet安装PreMailer.Net
更新Mailer类:
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;
}
完成!
答案 1 :(得分:3)
如果你有一个带有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);
注意:即使您认为自己不关心文字,也可以使用垃圾邮件过滤器。
我建议您阅读source for MailerBase,以便更好地了解所有这些Populate
方法会让您感到困惑。
注意:这可能不会按原样运行,但你明白了。我有代码(未显示)解析任何img标签并添加为自动附件。
重要的是清除HTML备用视图。您必须拥有文本视图的.text.cshtml
文件。
答案 2 :(得分:0)
如果您使用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的依赖项。