2016-04-27 16 views
1

Ich habe eine Konsolen-App, die Mails innerhalb eines Threads sendet.Wie schicke ich E-Mails innerhalb einer Schleife mit SMTP?

In dieser Thread-Methode habe ich eine Schleife, die E-Mails an jeden Empfänger säumt.

Ich habe Probleme, wo ich versuche, mehrere E-Mails zu senden, bevor die vorherigen die Chance hatten, gesendet zu werden.

mein Code:

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

Und die Sendemethode:

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); 
    } 
} 

ich diesen warrning bin immer:

weil dieser Anruf nicht die Ausführung des aktuellen Verfahrens abgewartet wird fortgesetzt, bevor der Anruf abgeschlossen ist. Betrachten Sie das erwartete opeartor auf das Ergebnis des Anrufs Anwendung

ich den warrning verstehen, aber ich kann nicht herausfinden, wie ich das erreichen kann, da ich eine Schleife, die durch alle meine Empfänger geht.

Wie kann ich das richtig machen?

Antwort

2

Dies ist eine schnelle Lösung (hinzugefügt await Schlüsselwort auf Ihren Anruf zu Mailmanager.SendMessageS), da Ihre Hilfsmethode arbeitet Async-Operation.

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

Es könnte bessere Möglichkeiten geben, dies als Gesamtprozess zu tun.

1

Das beste, was Sie hier tun können, ist eine Warteschlange zu verwenden.

Sie sollten alle Ihre Nachrichten zu einer Warteschlange hinzufügen und sie dann nacheinander bearbeiten, auch wenn Sie mehrere Threads benötigen.

Überprüfen Sie this Antwort für ein paar Beispiele.

Verwandte Themen