2017-10-27 7 views
2

Meine App sendet E-Mails an die angegebenen Adressen und das funktioniert gut. Problem ist, dass eine dieser E-Mail-Adressen falsch sein kann und nicht existiert. Ich verwende Delphi 2009 und Indy10 Komponenten (TIdSMTP und TIdMessage).Überprüfen Sie, ob die E-Mail gesendet wurde - Delphi Indy10

Try 
    Try 
    SMTP.Connect; 
    SMTP.Send(MailMessage); 
    resultTmp := ????? 
Except 
    on E : Exception do begin 
    ShowMessage(E.Message); 
    end; 
End; 
Finally 
    if SMTP.Connected then begin 
    SMTP.Disconnect; 
    end; 
End 

Wie kann ich überprüfen, ob eine E-Mail gesendet wurde oder nicht? Auf meinem Test-Gmail-Konto habe ich E-Mails wie "Adresse nicht gefunden" erhalten, wenn ich versuche, eine E-Mail an eine falsche Adresse zu senden.

Dank

Antwort

-2

Ich bin nicht sicher, dass Sie wissen, ob eine Adresse existiert, weil in gmail Sie eine E-Mail und Google-Server Antwort geschickt, dass es nicht existiert hat.

Mit Send-Methode können Sie eine Fehlermeldung von Ihrem Server erhalten SMTP, wie "Adresse nicht gültig", "Socket-Fehler", .. aber nichts über den Empfänger.

Die E-Mail, die Sie zum Senden einer Nachricht verwenden, wird eine Antwort erhalten, wenn der SMTP-Empfänger einen Fehler erkennt.

In meinem Code verwende ich auch EIdSMTPReplyError.

try 
    SMTP.Send(MailMessage); 
except 
    on E : EIdSMTPReplyError do 
    begin 
    ShowMessage(E.ErrorCode.ToString + ' : ' + E.Message); 
    end; 

    on E : Exception do 
    begin 
    ShowMessage(E.Message); 
    end 
end; 
+0

TIdSMPT hat ein Ereignis OnFailedRecipient, aber Programm dort nicht eingeben, wenn ich Haltepunkt setzen. Ich habe EIdSMTPReplyError nicht. Was sollte ich zur Verwendungsliste hinzufügen? – Shelboy

+1

Sie müssen die Verwendung IdReplySMTP hinzufügen. Wenn ich richtig OnFailedRecipient arbeite mit Empfänger von Ihrem Server akzeptiert, wird das nicht fehlschlagen, wenn der Empfänger nicht vorhanden war. Wenn er nicht existiert, erhalten Sie später eine Fehlermeldung. – Bosshoss

+0

Vielen Dank, aber das ändert sich nicht viel. Ich kann dem Nutzer in keiner Weise sagen, ob er eine falsche Adresse geschrieben hat, wenn ich keine Antwort bekomme. – Shelboy

4

Wenn Sie eine E-Mail an einen SMTP-Server zu senden, alles, was Sie wirklich die E-Mail an den Server gegeben tun, und es meldet zurück, ob es sie an den angegebenen Empfänger liefern TRY bis (s). Es gibt keine Garantie für die Lieferung.

Wenn ein bestimmter Empfänger für diesen Server/Domäne lokal ist, kann der empfangende SMTP-Server sofort (als Antwort auf den Befehl SMTP RCPT TO) melden, ob die E-Mail an diesen Empfänger gesendet wird oder nicht. TIdSMTP kann solche Fehler Ihrem Code über das Ereignis TIdSMTP.OnFailedRecipient melden oder eine Ausnahme auslösen.

Wenn die E-Mail jedoch nicht sofort an einen Empfänger zugestellt werden kann, muss sie asynchron geliefert werden, normalerweise durch Weiterleitung an einen anderen Server (möglicherweise mehrere Male), und die Zustellung erfolgt erst, nachdem Sie die E-Mail angegeben haben zum ursprünglichen Server und zog weiter.

Daher können Fehler, die während dieser Übermittlung auftreten, nicht von TIdSMTP gemeldet werden. Der SMTP-Server, der die E-Mail nicht zugestellt hat (möglicherweise derselbe Server, mit dem Sie verbunden sind, oder ein anderer Server, an den die E-Mail weitergeleitet wurde), sendet eine E-Mail an den Posteingang des ursprünglichen Absenders und erläutert die aufgetretenen Fehler .

Um diese Art von Fehlern zu erkennen, müssen Sie Ihren Posteingang regelmäßig überprüfen, z. B. mit POP3 oder IMAP, und dann die E-Mails für Details analysieren. Und solche Fehler können je nach der Art des Fehlers (der Fehler) einige Zeit in Anspruch nehmen, wie lange ein Server vor dem Aufgeben versucht, usw. Es kann also Minuten, Stunden oder sogar Tage dauern, bis eine Antwort zurückkommt , wenn überhaupt.

Im Allgemeinen gibt es keinen einzigen zuverlässigen Weg, um zu wissen, ob ein bestimmter Empfänger rechtzeitig gültig ist. Sie sollten SMTP einfach arbeiten lassen und Fehler asynchron behandeln.

Wenn Sie jedoch überprüfen müssen, wäre ein Weg sein TIdDNSResolver zu verwenden, um den MX-Eintrag (n) einer Domäne des Empfängers nachzuschlagen, dann verbinden TIdSMTP zu dieser Domain Server (n) und TIdSMTP.Verify() zu überprüfen, rufen Sie, wenn der Empfänger existiert auf diesen Servern.Dies setzt jedoch voraus, dass der/die Server den SMTP-Befehl VRFY implementiert, der von der SMTP-Protokollspezifikation optional ist. Er darf nicht von modernen Servern implementiert werden, um Wissenslecks zu vermeiden und Sicherheitslücken zu schließen.

Verwandte Themen