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.
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
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
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