Как переместить CSS в линию с PreMailer.Net, используя MvcMailer для отправки электронных писем в формате HTML
При использовании MvcMailer проблема заключается в том, что наши электронные письма отправляются без нашего CSS как атрибутов встроенного стиля.
PreMailer.Net - это библиотека C#, которая может читать исходную строку HTML и возвращать полученную строку HTML со встроенным CSS.
Как мы используем их вместе? Используя пример scaffolding в пошаговом руководстве MvcMailer, мы начнем с этого примера метода в нашем классе UserMailer Mailer:
public virtual MvcMailMessage Welcome()
{
return Populate(x => {
x.ViewName = "Welcome";
x.To.Add("some-email@example.com");
x.Subject = "Welcome";
});
}
3 ответа
Просто установите PreMailer.Net через NugGet
Обновите класс 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;
}
Готово!
Если у вас есть текстовое тело с 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.