2016-04-27 4 views
1

У меня есть консольное приложение, которое отправляет письма в поток.Как отправить электронную почту внутри в цикле с SMTP?

в этом методе потока У меня есть цикл, который отправляет электронные письма каждому получателю.

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

мой код:

  foreach(var m in mailModel.Recipients) 
      { 
       Mailmanager.SendMessageS(mailModel.DomainName, mailModel.Severity, DateTime.Now, m); 
      } 

И метод отправки:

public static async Task SendMessageS(string domainName, ErrorSeverity severity, DateTime errorTime, Recipient recipient) 
{ 

    try 
    { 
     string error = ""; 

     string fromEmail = "[email protected]"; 
     string toEmail = recipient.SendEmailTo; 

     MailMessage message = new MailMessage(fromEmail, toEmail); 
     Guid guid = Guid.NewGuid(); 
     SmtpClient smtpClient = new SmtpClient(server, port); 

     /*if (_useAuthentication)*/ 
     smtpClient.Credentials = new NetworkCredential("", ""); 
     smtpClient.EnableSsl = false; 

     //mail.Subject = subject; 
     //mail.Body = body; 

     message.Subject = "Problem (" + severity + ") " + domainName; 
     message.Body = BuildMessage(error, recipient.RecipientName, domainName, errorTime, severity); 

     smtpClient.SendCompleted += SendCompletedCallback; 

     await smtpClient.SendMailAsync(fromEmail, toEmail, message.Subject, message.Body /* user state, can be any object*/); 

    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

Я получаю эту warrning:

потому, что этот призыв не ожидал выполнение текущего метода продолжается до завершения вызова. Рассмотрим применение opeartor ждут в результате вызова

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

Как я могу сделать это правильно?

ответ

2

Это быстрое решение (добавлено ключевое слово await при вызове Mailmanager.SendMessageS), так как ваш служебный метод работает, выполняя операцию async.

Возможно, это будет лучший способ сделать это как общий процесс.

1

Лучшее, что нужно сделать, это использовать очередь.

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

Проверьте this Ответьте на несколько примеров.