Я работаю над сайтом, который будет рассылать значительное количество писем. Я хочу настроить текст верхнего и нижнего колонтитула или, возможно, даже шаблоны, чтобы пользователи могли легко редактировать эти электронные письма, если им нужно.
Если я вставлю HTML в строковые литералы C #, это будет некрасиво, и им придется беспокоиться о побеге. Включение плоских файлов для верхнего и нижнего колонтитула может сработать, но что-то в этом просто не так.
Что было бы идеальным, чтобы каким-то образом использовать .ASPX
страницу в качестве шаблона, а затем просто указать моему коду обслуживать эту страницу и использовать HTML, возвращенный для электронной почты.
Есть ли хороший и простой способ сделать это? Есть ли лучший способ решить эту проблему?
Обновлено:
я добавил ответ, который позволяет вам использовать стандартную страницу .aspx в качестве шаблона электронной почты. Просто замените все переменные, как обычно, используйте привязку данных и т. Д. Затем просто запишите вывод страницы и вуаля! У вас есть электронная почта в формате HTML!
ОБНОВЛЕНО CAVEAT !!!:
Я отлично использовал класс MailDefinition на некоторых страницах aspx, но при попытке использовать этот класс во время запущенного серверного процесса это не удалось. Я считаю, что это произошло потому, что для метода MailDefinition.CreateMailMessage () требуется действительный элемент управления для ссылки, хотя он не всегда что-то делает. Из-за этого я бы порекомендовал свой подход с использованием страницы aspx или подход Мана с использованием страницы ascx, что кажется немного лучше.
new System.Web.UI.Control()
как в:mailDefinition.CreateMailMessage("somebody@fake.com", iDictionaryReplacements, new System.Web.UI.Control())
.Ответы:
Здесь уже есть масса ответов, но я наткнулся на отличную статью о том, как использовать Razor с шаблонами электронной почты. Razor был запущен с ASP.NET MVC 3, но MVC не требуется для использования Razor. Это довольно гладкая обработка шаблонов писем
Как указано в статье, «Лучшее в Razor состоит в том, что в отличие от своего предшественника (веб-форм) он не привязан к веб-среде, мы можем легко разместить его вне Интернета и использовать его в качестве механизма шаблонов для различных целей».
Создание электронных писем HTML с помощью RazorEngine - Часть 01 - Введение
Использование шаблонов Razor вне ASP.NET: они больше не только для HTML!
Более умные шаблоны электронной почты в ASP.NET с помощью RazorEngine
Подобный Stackoverflow QA
Создание шаблонов с использованием нового RazorEngine API
Использование Razor без MVC
Можно ли использовать Razor View Engine за пределами asp.net
источник
Вы также можете попробовать загрузить элемент управления, а затем отобразить его в строке и установить его как тело HTML:
Затем вы можете создать свой адрес электронной почты как обычно:
Пользовательский элемент управления может содержать другие элементы управления, такие как верхний и нижний колонтитулы, а также использовать такие функции, как привязка данных.
источник
Вы можете попробовать класс MailDefinition
источник
Если вы хотите передать такие параметры, как имена пользователей, названия продуктов и т. Д., Вы можете использовать механизм шаблонов с открытым исходным кодом NVelocity для создания окончательного электронного письма / HTML.
Пример шаблона NVelocity ( MailTemplate.vm ):
Создание тела письма с помощью MailTemplate.vm в вашем приложении:
Текст письма с результатом:
Для редактирования шаблонов, возможно, вы можете использовать FCKEditor и сохранять шаблоны в файлы.
источник
Компонент электронной почты Mail.dll включает в себя шаблонизатор электронной почты:
Вот обзор синтаксиса:
И код, который загружает шаблон, заполняет данные из объекта C # и отправляет электронное письмо:
Вы можете получить больше информации в блоге о движке шаблонов электронной почты.
Или просто скачайте почтовый компонент Mail.dll и попробуйте.
Обратите внимание, что это коммерческий продукт, который я создал.
источник
Если гибкость является одним из ваших предварительных условий, XSLT может быть хорошим выбором, который полностью поддерживается платформой .NET, и вы даже можете позволить пользователю редактировать эти файлы. Эта статья ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) может быть полезна для начала (у msdn есть дополнительная информация об этом). Как сказал ScarletGarden, NVelocity - еще один хороший выбор, но я предпочитаю XSLT из-за его «встроенной» поддержки .NET framework и независимости от платформы.
источник
IXmlSerializable
интерфейса в мои классы. Всего через несколько строк я могу отправить класс по электронной почте.Я думаю, вы могли бы сделать что-то вроде этого:
Создайте страницу .aspx и поместите ее в конец метода OnLoad или вызовите вручную.
Я не уверен, есть ли с этим какие-либо потенциальные проблемы, но похоже, что это сработает. Таким образом, вы можете использовать полнофункциональную страницу .aspx вместо класса MailDefinition, который поддерживает только замену текста.
источник
Page
, по крайней мере, при использовании универсального метода расширения для рендеринга. Таким образом я переключился наUserControl
; мой ответ ниже. Пока что, похоже, все работает хорошо ... Мне было бы интересно узнать, как у вас это получалось в то время.Конечно, вы можете создать шаблон html, и я бы порекомендовал также текстовый шаблон. В шаблоне вы можете просто поместить [BODY] в то место, где будет размещено тело, а затем вы можете просто прочитать в шаблоне и заменить тело новым содержимым. Вы можете отправить электронное письмо с помощью .Nets Mail Class. Вам просто нужно пропустить отправку электронного письма всем получателям после того, как вы создадите письмо изначально. Сработало для меня как шарм.
источник
Вот еще одна альтернатива, которая использует преобразования XSL для более сложных шаблонов электронной почты: отправка электронной почты на основе HTML из приложений .NET .
источник
Будьте осторожны при этом, фильтры спама, похоже, блокируют HTML-код, сгенерированный ASP.net, по-видимому, из-за ViewState, поэтому, если вы собираетесь это сделать, убедитесь, что созданный HTML-код чистый.
Я лично изучил бы использование Asp.net MVC для достижения желаемых результатов. или NVelocity неплохо справляется с этим
источник
Вы можете легко создать WebRequest, чтобы попасть на страницу ASPX и получить результирующий HTML. Приложив немного больше усилий, вы, вероятно, сможете обойтись без WebRequest. PageParser и Response.Filter позволят вам запустить страницу и захватить вывод ... хотя могут быть и более элегантные способы.
источник
У меня было аналогичное требование в одном из проектов, где вам приходилось отправлять огромное количество писем каждый день, а клиент хотел получить полный контроль над шаблонами html для разных типов писем.
из-за большого количества отправляемых электронных писем производительность была главной проблемой.
то, что мы придумали, - это статический контент на сервере sql, где вы сохраняете всю разметку шаблона html (вместе с заполнителями, такими как [UserFirstName], [UserLastName], которые заменяются реальными данными во время выполнения) для разных типов писем
затем мы загрузили эти данные в кеш asp.net - поэтому мы не читаем html-шаблоны снова и снова - а только тогда, когда они действительно изменены
мы предоставили клиенту редактор WYSIWYG для изменения этих шаблонов через веб-форму администратора. всякий раз, когда производились обновления, мы сбрасывали кеш asp.net.
а затем у нас была отдельная таблица для журналов электронной почты, где регистрировалось каждое отправляемое электронное письмо. в этой таблице были поля с именами emailType, emailSent и numberOfTries.
мы просто запускали задание каждые 5 минут для важных типов писем (например, регистрация нового члена, забытый пароль), которые необходимо отправить как можно скорее
мы запускали новую работу каждые 15 минут для менее важных типов писем (например, рекламное письмо, новостное письмо и т. д.)
таким образом вы не блокируете свой сервер, отправляя непрерывные электронные письма, и вы обрабатываете почту в пакетном режиме. после отправки электронного письма вы устанавливаете в поле emailSent значение 1.
источник
Обратите внимание, что решениям aspx и ascx требуется текущий HttpContext, поэтому их нельзя использовать асинхронно (например, в потоках) без большой работы.
источник
Я думаю, что простой ответ - MvcMailer. Это пакет NuGet, который позволяет использовать ваш любимый движок просмотра для создания электронных писем. См. Пакет NuGet здесь и документацию по проекту.
Надеюсь, поможет!
источник
DotLiquid - еще один вариант. Вы указываете значения из модели класса, а
{{ user.name }}
затем во время выполнения вы предоставляете данные в этом классе и шаблон с разметкой, и он объединяет значения для вас. Это во многом похоже на использование движка шаблонов Razor. Он поддерживает более сложные вещи, такие как циклы и различные функции, такие как ToUpper. Приятно то, что они «безопасны», поэтому пользователь, создающий шаблоны, не может вывести из строя вашу систему или написать небезопасный код, как в бритве: http://dotliquidmarkup.org/try-onlineисточник
Если вы можете разрешить ASPNET и связанным пользователям разрешение на чтение и запись файла, вы можете легко использовать HTML-файл со стандартными
String.Format()
заполнителями ({0}
,{1:C}
и т. Д.) Для этого.Просто читать в файле как строку, используя классы из
System.IO
пространства имен. Получив эту строку, передайте ее в качестве первого аргументаString.Format()
и укажите параметры.Сохраните эту строку и используйте ее как тело электронного письма, и, по сути, все готово. Сегодня мы делаем это на десятках (правда, небольших) сайтов, и у нас не было никаких проблем.
Я должен отметить, что это работает лучше всего, если (а) вы не отправляете миллионы писем за раз, (б) вы не персонализируете каждое электронное письмо (иначе вы съедите тонну строк) и (c ) сам HTML-файл относительно невелик.
источник
Установите для сообщения электронной почты IsBodyHtml = true
Возьмите свой объект, содержащий содержимое электронной почты. Сериализуйте объект и используйте xml / xslt для создания содержимого html.
Если вы хотите сделать AlternateViews, сделайте то же, что и jmein, только используйте другой шаблон xslt для создания текстового содержимого.
Одно из основных преимуществ этого заключается в том, что если вы хотите изменить свой макет, все, что вам нужно сделать, это обновить шаблон xslt.
источник
Посмотрите на SubSonic (www.subsonicproject.com). Они делают именно это для генерации кода - шаблон является стандартным ASPX, и он выводит c #. Тот же метод можно использовать повторно для вашего сценария.
источник
Я бы использовал библиотеку шаблонов, например TemplateMachine . это позволяет вам в основном объединить ваш шаблон электронной почты с обычным текстом, а затем использовать правила для вставки / замены значений по мере необходимости. Очень похоже на ERB в Ruby. Это позволяет вам отделить генерацию почтового контента, не привязывая вас слишком сильно к чему-то вроде ASPX и т. Д., А после того, как контент будет сгенерирован с этим, вы можете отправить электронное письмо.
источник
Мне нравится ответ Раджа. Такие программы, как ListManager и фреймворки, такие как DNN, делают аналогичные вещи, и если требуется простое редактирование нетехнических пользователей, редакторы WYSIWYG для изменения HTML, хранящегося в SQL, в большинстве случаев являются простым и понятным способом и могут легко приспособить редактирование заголовков независимо от нижних колонтитулов, и т.д., а также использование токенов для динамической вставки значений.
Одна вещь, которую следует иметь в виду, если вы используете вышеуказанный метод (или любой, на самом деле), - это строго и осторожно подходить к тому, какие типы стилей и тегов вы разрешаете редакторам вставлять. Если вы думаете, что браузеры привередливы, просто подождите, пока не увидите, насколько по-разному почтовые клиенты отображают одно и то же ...
источник
Подобно ответу Canavar, но вместо NVelocity я всегда использую StringTemplate, который загружаю шаблон из файла конфигурации или загружаю внешний файл с помощью File.ReadAllText () и устанавливаю значения.
Это проект Java, но порт C # надежен, и я использовал его в нескольких проектах (просто использовал его для создания шаблонов электронной почты с использованием шаблона во внешнем файле).
Альтернативы всегда хороши.
источник
Вот простой способ использования класса WebClient :
Тогда просто назовите это так:
Конечно, ваш CSS должен быть встроен, чтобы отображать стили веб-страницы в большинстве почтовых клиентов (таких как Outlook). Если в вашем электронном письме отображается динамическое содержимое (например, имя клиента), я бы рекомендовал использовать QueryStrings на вашем веб-сайте для заполнения данных. (например, http://www.yourwebsite.com?CustomerName=Bob )
источник
@bardev предоставляет хорошее решение, но, к сожалению, не во всех случаях. Мой был одним из них.
Я использую WebForms на веб-сайте (клянусь, я больше никогда не буду использовать веб-сайт - что за PITA) в VS 2013.
Я попробовал предложение Razor, но, будучи веб-сайтом, я не получил столь важной функции IntelliSense, которую IDE предоставляет в проекте MVC. Мне также нравится использовать дизайнер для своих шаблонов - идеальное место для UserControl.
Никс снова на Razor.
Поэтому вместо этого я придумал этот небольшой фреймворк (советы @mun для UserControl и @imatoria для Strong Typing). Единственное возможное место проблемы, которое я вижу, это то, что вы должны быть осторожны, чтобы ваше имя файла .ASCX синхронизировалось с именем класса. Если вы заблудитесь, вы получите ошибку во время выполнения.
FWIW: В моем тестировании, по крайней мере, вызов RenderControl () не любит элемент управления Page, поэтому я выбрал UserControl.
Я почти уверен, что включил сюда все; дайте мне знать, если я что-то упустил.
HTH
Использование:
Базовый класс:
Класс «Заводской»:
Класс шаблона:
Заголовок ASCX:
Нижний колонтитул ASCX:
Шаблон ASCX:
Файл кода шаблона ASCX:
Помощники:
источник
Просто добавляю библиотеку, которую я использую, в микс: https://github.com/lukencode/FluentEmail
Он отображает электронные письма с помощью RazorLight , использует свободный стиль для создания электронных писем и поддерживает несколько отправителей из коробки. Он также поставляется с методами расширения для ASP.NET DI. Простая в использовании, небольшая настройка, с поддержкой обычного текста и HTML.
источник