Что будет считаться лучшим способом для разработки архитектуры отправки электронной почты из веб-приложения на C #? - PullRequest
7 голосов
/ 19 декабря 2011

Я работаю над веб-приложением, которое скоро будет запущено, и сейчас я пытаюсь найти лучший способ обработки отправки электронной почты из приложения.Я полностью понимаю, КАК отправлять электронную почту из приложения, используя классы MailMessage и SmtpClient, однако мой вопрос под другим углом.Моей главной целью на моей работе до этого проекта была поддержка старых приложений, которые были разработаны до моего времени.В этих приложениях, когда им нужно было отправить электронное письмо, они жестко закодировали любое из сообщений в фактическое сообщение со всеми тегами HTML, встроенными непосредственно в код C #.

Приложение, над которым я работаю, будет иметьшаблон для отправки электронных писем, как своего рода контейнер стиля, и различные сообщения будут встроены в основные элементы содержимого шаблона.Я хотел бы избежать жесткого кодирования этих шаблонов в этом приложении, поэтому я пытался найти лучший способ макета моего проекта.Я думал об использовании шаблона t4, чтении различных t4 в приложение и применении String.Format с указанными параметрами для добавления имен / электронных писем к сообщениям, которые будут отправлены.Однако я не уверен, что это лучший способ сделать это.

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

Мой вопрос: как вы подходили к этому в прошлом?Что сработало, а что нет и по каким причинам?Я просмотрел всю информацию в Интернете, но либо единственный доступный способ КАК отправить сообщение, либо я не использовал правильные мощные слова Google.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Я делаю это следующим образом:

  • Кодируйте его обычным способом с помощью ViewModel и Razor Template
  • Создавая электронную почту, используйте http://razorengine.codeplex.com/ для загрузкии проанализируйте шаблон
  • Помните, что не следует использовать Html и Url helper, если вы хотите отправлять электронные письма в потоке, потому что они полагаются на HttpContext, которого у вас нет в этом случае.При необходимости создайте собственных помощников.

Например, если у вас есть ViewModel Car в вашем приложении, которое где-то отображается, вы также можете использовать эту ViewModel как @model в шаблоне Razor для e-mail.

0 голосов
/ 19 декабря 2011

Мне приходилось делать это пару раз. Первоначально я использовал шаблонизатор ASP.Net, основанный, как мне кажется, на блоге Рика Строля. Это работало, но всегда была какая-то проблема, против которой я бился головой.

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

Код для слияния значений в шаблон:

private string Merge(ManualTypeEnum manualType, Object mergeValues)
{
    var body = "";
    var templateFile = string.Format("{0}MailTemplate.vm", manualType);
    var velocity = new VelocityEngine();
    var props = new ExtendedProperties();
    props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath);
    velocity.Init(props);
    var template = velocity.GetTemplate(templateFile);
    var context = new VelocityContext();
    context.Put("Change", mergeValues);
    using (var writer = new StringWriter())
    {
        template.Merge(context, writer);
        body = writer.ToString();
    }
    return body;
}

Значения для слияния передаются как анонимный объект и могут включать в себя различные типы, включая списки и т. Д., Например,

var emailBody = Merge(newDocument.ManualType, new
{
    ManualType = newDocument.ManualType.ToString(),
    Message = change.Message,
    NewTitle = newDocument.Title ?? "",
    NewVersion = newDocument.Version ?? "",
    Contact = From,
    Changes = change.ToList(),
});
...