Как отправлять автоматические электронные письма, такие как информационный бюллетень

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

Сначала я пытаюсь разработать консольное приложение Windows.

Частота отправки: с понедельника по пятницу.

Сколько пользователей: от 5 до 20

Формат данных: таблица, в которой строки — это страны, а столбцы — разные типы продуктов, а ячейки представляют продажи продукта в этой стране.

Ограничение: пользователи службы предпочитают не использовать файлы pdf или excel, а вложения любого типа должны иметь формат html, который можно отображать в теле письма.

В настоящее время я создаю отчет почти ремесленником с чем-то вроде:

.....
var myStringBuilder = new StringBuilder("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
myStringBuilder.Append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">");
myStringBuilder.Append("</head><body>");
myStringBuilder.AppendLine();
myStringBuilder.Append("<table style=\"font-family: Calibri; text-align: right; font-size: x-small;\">");
myStringBuilder.AppendLine();
var header = new StringBuilder("<tr><th>a</th><th>CATEG1</th><th>CATEG2</th><th>CATEG3</th><th>CATEG4</th><th>TOTAL</th></tr>");
var line = new StringBuilder("<tr><td>a</td><td>b</td><td>c</td><td>z</td><td>e</td><td>f</td></tr>");
foreach (var a in _actuals)
        {
            line.Replace("a", a.CountryName);
            if(a.Segment.ToLowerInvariant().Equals("categ1")) {
               line.Replace("b", "[" + string.Format("{0:0,#}", a.LsvLcFact / 1000) + "]"); }
            else if (a.Segment.ToLowerInvariant().Equals("categ2")) {
               line.Replace("c", "[" + string.Format("{0:0,#}", a.LsvLcFact / 1000) + "]"); }
            else if (a.Segment.ToLowerInvariant().Equals("categ3")) {
               line.Replace("z", "[" + string.Format("{0:0,#}", a.LsvLcFact / 1000) + "]"); } 
            else {
               line.Replace("e", "[" + string.Format("{0:0,#}", a.LsvLcFact / 1000) + "]"); }
          }
 .....

И в классе для отправки почты что-то вроде:

    public void SendResumen(string subject ,StringBuilder content)
    {
        var oMsg = new MailMessage...;
        ... add users
        oMsg.Subject = subject;
        var mimeType = new ContentType("text/html");
        var alternate = AlternateView.CreateAlternateViewFromString(content.ToString(), mimeType);
        oMsg.AlternateViews.Add(alternate);
        oMsg.IsBodyHtml = true;
        var cli = Client();
        cli.Send(oMsg);
    }

Наконец, я надеюсь, вы понимаете, что я делаю, и вопрос: есть ли инструмент, который я могу использовать, чтобы не генерировать тело сообщения как созданное?


person Guillermo    schedule 08.05.2013    source источник
comment
Я думаю, вам нужна функция слияния почты. Взгляните на stackoverflow.com/q/3463809/56778.   -  person Jim Mischel    schedule 09.05.2013


Ответы (2)


У меня есть приложение VB, которое может отправлять сообщения с полезной нагрузкой HTML, и оно не использует функциональность AlternateView.

Dim mail As New MailMessage(fromUser.Email, toUser.Email)
mail.Subject = subject
mail.IsBodyHtml = True
mail.Body = message

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

person Dave Michener    schedule 08.05.2013

Я принимаю предложение от @Jim-Mischel

person Guillermo    schedule 13.05.2013