2016-08-24 2 views
1

Es gibt also einige großartige Beispiele dafür, wie Sie mit Mailkit eine E-Mail über SMTP versenden können.Mailkit Senden und Prüfen von aysynchronem SMTP

Regel mit der Endung:

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.Send(emailMessage); 
client.Disconnect(true); 

Dies ist jedoch nicht gut, wenn async benötigt wird:

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

jedoch, was ich wissen möchte, wenn ein asynchrones Senden abgeschlossen ist, oder wenn es gelingt nicht. Unter .Net nativen Bibliotheken wird dies mit einem Callback (Event-Handler) erreicht.

Ist es möglich, einen 'Completed' Callback-Handler für ein MailKit SendAsync zu definieren, und wenn nicht, was ist die beste Vorgehensweise, um festzustellen, ob es erfolgreich war oder nicht.

Dank

Antwort

2

Sie wollen nicht, Code wie diesen haben:

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

Dies wird der Asynchron-Sendevorgang abgeschlossen trennen, bevor.

Stattdessen möchten Sie, dies zu tun:

client.Authenticate(theSMTPUsername,theSMTPPassword); 
await client.SendAsync(emailMessage); 
client.Disconnect(true); 

Natürlich, wenn Sie ein asynchrones Aufgabe erwarten ... jetzt Sie keine Completed-Ereignis brauchen :)

Das heißt, es ist ein messagesent Ereignis, das Sie eine Verbindung herstellen können:

http://www.mimekit.org/docs/html/E_MailKit_MailTransport_MessageSent.htm

+0

Dank für die Lenk. Warten ist schöner, dass ein Rückruf. – Hughgo

+0

Sieht man sich das genauer an, bin ich nicht überzeugt, dass die Lösung funktionieren wird. Warten auf einen asynchronen Aufruf wartet nur auf die Rückkehr des Async-Teils. Dies wird nicht auf das Senden der Nachricht warten. Der obige Code könnte Rennen auslösen und trennen, bevor die Arbeit erledigt ist. Eine bessere Möglichkeit wäre, die * synchronen * APIs zu erwarten. Dies stellt sicher, dass jede Phase durchgeführt wird, bevor Sie fortfahren. – Hughgo

+0

Wenn 'client.Send()' zurückgibt, wurde die Nachricht gesendet. Wenn die Steuerung nach 'await client.SendAsync() 'fortfährt, wird die Nachricht ebenfalls gesendet. Es wird keine Rasse geben. Sie können synchrone APIs nicht erwarten. – jstedfast