2017-12-19 2 views
0

Ich versuche, E-Mails mit meiner MVC5-Anwendung zu senden. Um dies zu tun, habe ich Mailkit v 1.22.0 durch NuGet Paketmanager installiert. Und das ist, wie mein Code wie folgt aussieht:MVC5 Mailkit senden E-Mail mit falscher E-Mail-Adresse

var FromAddress = "[email protected]"; 
    var FromAddressTitle = "My Org"; 
    var connection = ConfigurationManager.ConnectionStrings["SmtpServer"].ConnectionString; 

    var Email = new MimeMessage(); 
    Email.From.Add(new MailboxAddress(FromAddressTitle, FromAddress)); 

    var AddressArray = value.SentTo.Split(';'); 
    foreach (var item in AddressArray) 
    { 
     Email.To.Add(new MailboxAddress(item)); 
    } 

    Email.Subject = value.Subject;   
    Email.Body = new TextPart("html") 
    { 
     Text = value.Content 
    }; 

    using (var client = new SmtpClient()) 
    { 
     client.Connect(connection); 
     client.Send(Email); 
    } 

    return "Email Successfully Sent"; 

, die außer wenn eine falsche Empfänger E-Mail-Adresse funktioniert gut eingegeben wurde, wird die Anwendung nicht erkennen, ob die E-Mail tatsächlich gesendet wurde oder nicht (client.Send (E-Mail) gibt void zurück). Gibt es eine Möglichkeit zu wissen, ob es tatsächlich an den Empfänger gesendet wurde oder nicht? Wenn es mit Mailkit nicht möglich ist, gibt es ein anderes NuGet-Paket, das dies ermöglicht?

+0

Der beste Weg, um hier zu gehen, ist die Verwendung eines externen Dienstes wie [SendGrid] (https://sendgrid.com), der Einrichtungen zur Verarbeitung und Handhabung von Bounces besitzt. –

Antwort

1

Der Grund dafür, dass SmtpClient.Send() void zurückgibt, ist, dass das SMTP-Protokoll nicht angibt, ob die Nachricht erfolgreich zugestellt wird. Sie können dem Client nur mitteilen, dass die Nachrichten vom Server akzeptiert wurden oder nicht (in diesem Fall löst MailKit eine Ausnahme aus).

Wenn Sie wissen möchten, ob die Nachricht erfolgreich zugestellt wurde, müssen Sie nach unzustellbaren Nachrichten suchen, die Minuten oder sogar Stunden dauern können.

Das erste, was Sie tun müssen, ist jedoch Unterklasse SmtpClient und überschreiben die GetEnvelopeId und GetDeliveryStatusNotifications Methoden.

Wenn Sie eine Bounce-Nachricht erhalten, ist der MIME-Teil der obersten Ebene normalerweise ein multipart/report (dargestellt durch ein MultipartReport Objekt, wenn Sie MimeKit verwenden). Diese multipart/report enthält dann einen message/delivery-status MIME-Teil (und möglicherweise andere), die eine Liste von header-ähnlichen Feldern haben, die die Details über den Lieferstatus für 1 oder mehrere Empfänger angeben.

MimeKit viel das für Sie analysieren wird (zB hat es eine MessageDeliveryStatus Klasse, die eine StatusGroups Eigenschaft enthält, die Sie verwenden möchten. Doch was MimeKit tut nicht tun ist, die einzelnen Feldwerte analysieren (aber sie sollte nicht so schwierig für Sie zu tun, in der Regel ein paar Split(';') ‚s sollte genug iirc für einige schnelle & schmutzig Parsing) sein werden.

Sie wollen die Spezifikation für diese bei https://tools.ietf.org/html/rfc3464

The MimeKit lesen Dokumente, die oben verlinkt sind, geben an, welche Bereiche genau betrachtet werden sollen ly at (ich denke 2.2 und 2.3).

Ich würde empfehlen, speziell auf die Original-Recipient und Action Felder zu schauen.

original-recipient-field = 
     "Original-Recipient" ":" address-type ";" generic-address 

    generic-address = *text 

    action-field = "Action" ":" action-value 

    action-value = 
     "failed"/"delayed"/"delivered"/"relayed"/"expanded" 

Sie müssen auch das Original-Envelope-Id Feld, um herauszufinden, welche Nachricht an berichtet wird:

original-envelope-id-field = 
       "Original-Envelope-Id" ":" envelope-id 

    envelope-id = *text 

Der envelope-id Text wird die gleiche Zeichenfolge, die durch Ihre GetEnvelopeId Implementierung in der SmtpClient Klasse zurückgegeben werden.