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

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

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

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

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

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

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

Ответы [ 23 ]

1 голос
/ 09 марта 2011

Я думаю, что простой ответ - MvcMailer. Это пакет NuGet, который позволяет вам использовать ваш любимый движок для создания электронных писем. См. Пакет NuGet здесь и проектную документацию

Надеюсь, это поможет!

1 голос
/ 17 ноября 2009

Обратите внимание, что для решений aspx и ascx требуется текущий HttpContext, поэтому его нельзя использовать асинхронно (например, в потоках) без большой работы.

1 голос
/ 06 марта 2009

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

Вы можете легко создать WebRequest, чтобы попасть на страницу ASPX и получить результирующий HTML. Приложив немного больше работы, вы, вероятно, сможете сделать это без WebRequest. PageParser и Response.Filter позволят вам запустить страницу и захватить вывод ... хотя могут быть и более элегантные способы.

1 голос
/ 27 марта 2009

У меня было аналогичное требование к одному из проектов, когда вам приходилось отправлять огромное количество писем каждый день, и клиент хотел получить полный контроль над HTML-шаблонами для разных типов писем.

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

мы получили статический контент на сервере SQL, где вы сохраняете разметку всего HTML-шаблона (вместе с заполнителями, такими как [UserFirstName], [UserLastName], которые заменяются реальными данными во время выполнения) для различных типов электронная почта

затем мы загрузили эти данные в кэш asp.net - поэтому мы не читаем html-шаблоны снова и снова - но только когда они действительно меняются

мы дали клиенту редактор WYSIWYG для изменения этих шаблонов через веб-форму администратора. При каждом обновлении мы сбрасываем кэш asp.net.

и затем у нас была отдельная таблица для журналов электронной почты - где регистрировалось каждое отправляемое письмо. в этой таблице есть поля с именами emailType, emailSent и numberOfTries.

мы просто запускали работу каждые 5 минут для важных типов электронной почты (например, регистрация нового участника, забытый пароль), которые необходимо отправить как можно скорее

каждые 15 минут мы выполняли другую работу для менее важных типов электронной почты (например, для рекламных писем, новостей и т. Д.)

таким образом, вы не блокируете свой сервер, отправляющий электронные письма без остановки, и обрабатываете почту в пакетном режиме. как только письмо отправлено, вы устанавливаете в поле emailSent значение 1.

1 голос
/ 08 марта 2013

DotLiquid - еще один вариант. Вы задаете значения из модели класса как {{ user.name }}, а затем во время выполнения вы предоставляете данные в этом классе и шаблон с разметкой, и он объединит значения для вас. Это во многом похоже на использование движка шаблонов Razor. Он поддерживает более сложные вещи, такие как циклы и различные функции, такие как ToUpper. Хорошая вещь в том, что они «безопасны», так что пользователь, который создает шаблоны, не может сломать вашу систему или написать небезопасный код, как в бритве:

0 голосов
/ 18 октября 2012

Вот простой способ использования WebClient класса:

public static string GetHTMLBody(string url)
{
    string htmlBody;

    using (WebClient client = new WebClient ())
    {
        htmlBody = client.DownloadString(url);
    }

    return htmlBody;
}

Тогда просто назовите это так:

string url = "http://www.yourwebsite.com";
message.Body = GetHTMLBody(url);

Конечно, ваш CSS должен быть встроен, чтобы показать стили веб-страницы в большинстве почтовых клиентов (таких как Outlook). Если ваша электронная почта отображает динамическое содержимое (например, имя клиента), я бы рекомендовал использовать QueryStrings на вашем веб-сайте для заполнения данными. (напр. http://www.yourwebsite.com? CustomerName = Bob )

0 голосов
/ 07 марта 2009

Установить набор сообщений электронной почты IsBodyHtml = true

Возьмите ваш объект, который содержит содержимое вашей электронной почты. Сериализуйте объект и используйте xml / xslt для генерации html-контента.

Если вы хотите сделать AlternateViews, сделайте то же самое, что jmein использует только другой шаблон xslt для создания простого текстового содержимого.

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

0 голосов
/ 29 января 2010

Аналогично ответу Канавара, но вместо NVelocity я всегда использую " StringTemplate " который я загружаю шаблон из файла конфигурации, или загрузить внешний файл с помощью File.ReadAllText () и установить значения.

Это Java-проект, но порт C # является надежным, и я использовал его в нескольких проектах (просто использовал его для шаблонов писем, используя шаблон во внешнем файле).

Альтернативы всегда хороши.

0 голосов
/ 31 марта 2009

Мне нравится ответ Радж. Такие программы, как ListManager, и фреймворки, такие как DNN, выполняют аналогичные функции, и, если требуется простое редактирование пользователями, не являющимися техническими специалистами, редакторы WYSIWYG для изменения HTML-кода, хранящегося в SQL, - это в основном простой и понятный способ, позволяющий легко редактировать заголовки независимо от колонтитулов и т.д., а также использование токенов для динамического добавления значений.

При использовании вышеуказанного метода (или любого другого) следует помнить о строгости и осторожности в отношении того, какие типы стилей и тегов вы разрешаете редакторам вставлять. Если вы думаете, что браузеры привередливы, просто подождите, пока не увидите, как по-разному почтовые клиенты отображают одно и то же ...

0 голосов
/ 31 марта 2009

Я бы использовал библиотеку шаблонов, такую ​​как TemplateMachine . это позволяет вам в основном составлять шаблон электронной почты вместе с обычным текстом, а затем использовать правила для ввода / замены значений по мере необходимости. Очень похоже на ERB в Ruby. Это позволяет вам отделить генерацию почтового контента, не привязывая вас слишком сильно к чему-то вроде ASPX и т. Д., И после того, как контент сгенерирован с этим, вы можете отправить электронное письмо.

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