Правильный способ послать электронное письмо от службы Windows

Я должен послать много электронных писем (вероятно, сотни дня) по графику базируются. Путем я думаю, чтобы сделать это, следующим образом, но проблема состоит в том, что мое поле Body может стать очень большим, и если я добавляю его как строку, это становится ужасным.

        SmtpClient client = new SmtpClient(); //host and port picked from web.config
        client.EnableSsl = true;

        MailMessage message = new MailMessage();

        message.Body = "test from winservice"; // HERE IS MY PROBLEM
        message.IsBodyHtml = true;
        message.From = new MailAddress("donotreply@abcde.com");
        message.Subject = "My subject";
        message.To.Add(new MailAddress("piniusha@abcde.com"));
        try
        {
            client.Send(message);
        }
        catch (Exception)
        {

        }

Когда я должен был сделать это от aspx страницы, я использовал

    MailDefinition message = new MailDefinition();  

    message.BodyFileName = @"~\EmailTemplate\Template1.htm";
    ListDictionary replacements = new ListDictionary();
    replacements.Add("<% Name %>", this.txtName.Text);
    replacements.Add("<% PhoneOrEmail %>", this.txtPhoneOrEmail.Text);
    replacements.Add("<% Message %>", this.txtMessage.Text);
    MailMessage msgHtml = message.CreateMailMessage(RECIPIENTS, replacements, new LiteralControl());

Я думаю, что это - изящное решение, но я не хочу ссылаться к Системе. Сеть. UI.WebControls. MailDefinition, потому что я нахожусь в winservice.

Мои вопросы:

  1. Что лучший способ состоит в том, чтобы послать объемные электронные письма от winservice?
  2. Действительно ли возможно отправить его от учетной записи Gmail? или они собираются заблокировать меня через некоторое время?

спасибо за любую справку.

7
задан UshaP 10 March 2010 в 16:58
поделиться

4 ответа

Почему бы вам не использовать ту же концепцию, что и в MailDefinition? Загрузите тело из вашего файла шаблона, замените некоторые маркеры текстом из другого списка - стиль слияния почты?

Все, что вы делаете, - это foreach над набором данных, который нужно объединить с шаблоном. Загрузите данные слияния, переберите данные слияния, заменив токены в шаблоне текущей записью слияния. Установите тело сообщения как текущее созданное сообщение. Прикрепите сообщение к очереди сообщений или отправьте его сейчас, в зависимости от того, что вы выберете.

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

message.IsBodyHtml = true;
message.From = new MailAddress("MailSender@MyCompany.com");
message.Subject = "My bogus email subject";

string[] lines = File.ReadAllLines(@"~\MergeData.csv");
string originalTemplate = File.ReadAllText(@"~\Template.htm");

foreach(string line in lines)
{
    /* Split out the merge data */
    string[] mergeData = line.Split(',');

    /* Reset the template - to revert changes made in previous loop */
    string currentTemplate = originalTemplate;

    /* Replace the merge tokens with actual data */
    currentTemplate = currentTemplate.Replace("[[FullNameToken]]", mergeData[0]); 
    currentTemplate = currentTemplate.Replace("[[FirstNameToken]]", mergeData[1]);
    currentTemplate = currentTemplate.Replace("[[OtherToken]]", mergeData[2]);

    /*... other token replacements as necessary.
     * tokens can be specified as necessary using whatever syntax you choose
     * just make sure that there's something denoting the token so you can
     * easily replace it */

    /* Transfer the merged template to the message body */
    message.Body = currentTemplate;

    /* Clear out the address from the previous loop before adding the current one */
    message.To.Clear();
    message.To.Add(new MailAddress(mergeData[3]));
    client.Send(message);
}
5
ответ дан 7 December 2019 в 12:18
поделиться

Простой ответ:

message.Body = File.ReadAllText(@"~\EmailTemplate\Template1.htm");

Я не уверен насчет ваших конкретных пунктов, но уверен, что кто-то еще ответит на них:)

0
ответ дан 7 December 2019 в 12:18
поделиться

Я бы использовал какой-нибудь шаблонизатор. StringTemplate , например.

0
ответ дан 7 December 2019 в 12:18
поделиться

Что плохого в использовании

"messageBody".Replace("<% Name %>", curr.Name).Replace(....)...
?

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

0
ответ дан 7 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: