Могу ли я настроить шаблоны HTML / электронной почты с ASP.NET? - PullRequest
94 голосов
/ 06 марта 2009

Я работаю над сайтом, который будет рассылать значительное количество писем. Я хочу настроить как верхний, так и нижний колонтитулы или, возможно, даже шаблоны, чтобы пользователи могли легко редактировать эти электронные письма, если им это необходимо.

Если я вставлю HTML-код в строковые литералы C #, это будет ужасно, и им придется беспокоиться о побеге. Включение плоских файлов для верхнего и нижнего колонтитула может сработать, но что-то в этом не так.

Что было бы идеально, если бы каким-то образом использовать страницу .ASPX в качестве шаблона, а затем просто указать мой код для обслуживания этой страницы и использовать HTML-код, возвращенный для электронной почты.

Есть ли хороший и простой способ сделать это? Есть ли лучший способ решить эту проблему?

Изменено:
Я добавил ответ, который позволяет использовать стандартную страницу .aspx в качестве шаблона электронной почты. Просто замените все переменные, как обычно, используйте привязку данных и т. Д. Затем просто запишите выходные данные страницы и вуаля! У вас есть электронная почта в формате HTML!

ОБНОВЛЕНО CAVEAT !!!:
Я использовал класс MailDefinition на некоторых страницах aspx просто отлично, но при попытке использовать этот класс во время запущенного серверного процесса он не удался. Я полагаю, что это потому, что метод MailDefinition.CreateMailMessage () требует действительный элемент управления для ссылки, даже если он не всегда что-то делает. По этой причине я бы порекомендовал свой подход с использованием страницы aspx или подход Маня с использованием страницы ascx, что выглядит немного лучше.

Ответы [ 23 ]

71 голосов
/ 24 февраля 2011

Здесь уже есть тонна ответов, но я наткнулся на отличную статью о том, как использовать Razor с шаблонами писем. Razor был запущен с ASP.NET MVC 3, но MVC не требуется использовать Razor. Это довольно приятная обработка шаблонов электронной почты

Как указывается в статье: «Лучшее в Razor - это то, что в отличие от его предшественника (веб-форм) он не связан с веб-средой, мы можем легко разместить его вне сети и использовать его в качестве механизма шаблонов для различных целей».

Создание электронных писем в формате HTML с помощью RazorEngine - Часть 01 - Введение

Использование шаблонов Razor за пределами ASP.NET: они больше не только для HTML!

Более разумные шаблоны электронной почты в ASP.NET с RazorEngine

Аналогичен Stackoverflow QA

Создание шаблонов с использованием нового API RazorEngine

Использование бритвы без MVC

Возможно ли использовать Razor View Engine за пределами asp.net

55 голосов
/ 06 марта 2009

Вы также можете попробовать загрузить элемент управления, а затем отобразить его в виде строки и установить его в качестве тела HTML:

// Declare stringbuilder to render control to
StringBuilder sb = new StringBuilder();

// Load the control
UserControl ctrl = (UserControl) LoadControl("~/Controls/UserControl.ascx");

// Do stuff with ctrl here

// Render the control into the stringbuilder
StringWriter sw = new StringWriter(sb);
Html32TextWriter htw = new Html32TextWriter(sw);
ctrl.RenderControl(htw);

// Get full body text
string body = sb.ToString();

Вы можете создать свою электронную почту как обычно:

MailMessage message = new MailMessage();
message.From = new MailAddress("from@email.com", "from name");
message.Subject = "Email Subject";
message.Body = body;
message.BodyEncoding = Encoding.ASCII;
message.IsBodyHtml = true;

SmtpClient smtp = new SmtpClient("server");
smtp.Send(message);

Пользовательский элемент управления может содержать другие элементы управления, такие как верхний и нижний колонтитулы, а также использовать такие функции, как привязка данных.

35 голосов
/ 06 марта 2009

Вы можете попробовать класс MailDefinition

18 голосов
/ 06 марта 2009

Если вы хотите передать такие параметры, как имена пользователей, названия продуктов и т. Д., Вы можете использовать шаблонизатор с открытым исходным кодом NVelocity для создания вашего окончательного электронного письма / HTML.

Пример шаблона NVelocity ( MailTemplate.vm ):

A sample email template by <b>$name</b>.
<br />

Foreach example :
<br />    
#foreach ($item in $itemList)

[Date: $item.Date] Name: $item.Name, Value: $itemValue.Value
<br /><br />

#end

Создание почтового тела с помощью MailTemplate.vm в вашем приложении:

VelocityContext context = new VelocityContext();
context.Put("name", "ScarletGarden");
context.Put("itemList", itemList);

StringWriter writer = new StringWriter();

Velocity.MergeTemplate("MailTemplate.vm", context, writer);

string mailBody = writer.GetStringBuilder().ToString();

Почтовое тело результата:

Образец электронного письма от ScarletGarden .

Пример Foreach:

[Дата: 12.02.2009] Имя: Пункт 1, Значение: 09

[Дата: 21.02.2009] Имя: Пункт 4, Значение: 52

[Дата: 01.03.2009] Имя: пункт 2, Значение: 21

[Дата: 23.03.2009] Имя: Пункт 6, Значение: 24

Для редактирования шаблонов, возможно, вы можете использовать FCKEditor и сохранять ваши шаблоны в файлы.

7 голосов
/ 01 марта 2010

Компонент электронной почты Mail.dll включает механизм шаблонов электронной почты:

Вот обзор синтаксиса:

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order '{Name}' sent to <strong>{Street}</strong>. 
{end}

</body>
</html>

И код, который загружает шаблон, заполняет данные из объекта c # и отправляет электронное письмо:

Mail.Html(Template
              .FromFile("template.txt")
              .DataFrom(_contact)
              .Render())
    .Text("This is text version of the message.")
    .From(new MailBox("alice@mail.com", "Alice"))
    .To(new MailBox("bob@mail.com", "Bob"))
    .Subject("Your order")
    .UsingNewSmtp()
    .WithCredentials("alice@mail.com", "password")
    .Server("mail.com")
    .WithSSL()
    .Send();

Вы можете получить больше информации о движке шаблонов электронной почты сообщении в блоге.

Или просто скачайте компонент электронной почты Mail.dll и попробуйте.

Обратите внимание, что это коммерческий продукт, который я создал.

6 голосов
/ 26 марта 2009

Если гибкость является одним из ваших предварительных условий, XSLT может быть хорошим выбором, который полностью поддерживается .NET Framework, и вы сможете даже позволить пользователю редактировать эти файлы. Эта статья (http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/) может быть полезна для начала (MSDN имеет больше информации об этом). По словам ScarletGarden, NVelocity - еще один хороший выбор, но я предпочитаю XSLT за его «встроенную» поддержку .NET Framework и независимость от платформы.

4 голосов
/ 24 марта 2009

Я думаю, вы могли бы сделать что-то вроде этого:

Создайте и страницу .aspx и поместите это в конец метода OnLoad или вызовите его вручную.

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter htmlTW = new HtmlTextWriter(sw);
    this.Render(htmlTW);

Я не уверен, есть ли потенциальные проблемы с этим, но похоже, что это будет работать. Таким образом, вы можете использовать полнофункциональную страницу .aspx вместо класса MailDefinition, который поддерживает только замены текста.

4 голосов
/ 27 августа 2009

Вот еще одна альтернатива, которая использует преобразования XSL для более сложных шаблонов электронной почты: Отправка электронной почты на основе HTML из приложений .NET .

4 голосов
/ 06 марта 2009

Конечно, вы можете создать HTML-шаблон, и я бы порекомендовал также текстовый шаблон. В шаблоне вы можете просто поместить [BODY] в место, где будет размещено тело, а затем вы можете просто прочитать в шаблоне и заменить тело новым содержимым. Ты можешь отправить электронная почта, используя .Nets Mail Class. Вам просто нужно перебрать отправку письма всем получателям после того, как вы изначально создали письмо. Сработал как шарм для меня.

using System.Net.Mail;

// Email content
string HTMLTemplatePath = @"path";
string TextTemplatePath = @"path";
string HTMLBody = "";
string TextBody = "";

HTMLBody = File.ReadAllText(HTMLTemplatePath);
TextBody = File.ReadAllText(TextTemplatePath);

HTMLBody = HTMLBody.Replace(["[BODY]", content);
TextBody = HTMLBody.Replace(["[BODY]", content);

// Create email code
MailMessage m = new MailMessage();

m.From = new MailAddress("address@gmail.com", "display name");
m.To.Add("address@gmail.com");
m.Subject = "subject";

AlternateView plain = AlternateView.CreateAlternateViewFromString(_EmailBody + text, new System.Net.Mime.ContentType("text/plain"));
AlternateView html = AlternateView.CreateAlternateViewFromString(_EmailBody + body, new System.Net.Mime.ContentType("text/html"));
mail.AlternateViews.Add(plain);
mail.AlternateViews.Add(html);

SmtpClient smtp = new SmtpClient("server");
smtp.Send(m);
2 голосов
/ 27 марта 2009

Будьте осторожны при этом, спам-фильтры, по-видимому, блокируют сгенерированный ASP.net html, по-видимому, из-за ViewState, поэтому, если вы собираетесь это сделать, убедитесь, что полученный html является чистым.

Я лично хотел бы использовать Asp.net MVC для достижения желаемых результатов. или NVelocity достаточно хорош в этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...