检查电子邮件是否已发送 -- Delphi Indy10

She*_*boy 2 delphi email indy delphi-2009 indy10

我的应用程序将电子邮件发送到给定的地址,这工作正常。问题是,这些电子邮件地址之一可能不正确并且不存在。我正在使用 Delphi 2009 和 Indy10 组件(TIdSMTP 和 TIdMessage)。

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
Run Code Online (Sandbox Code Playgroud)

如何检查电子邮件是否已发送?在我的测试 Gmail 帐户中,如果我尝试将电子邮件发送到错误的地址,我会收到类似“地址未找到”的电子邮件。

谢谢

Rem*_*eau 6

当您向 SMTP 服务器发送电子邮件时,您真正要做的就是将电子邮件发送给服务器,它会报告是否会尝试将其发送给指定的收件人。不保证交货。

如果给定的收件人是该服务器/域的本地收件人,则接收 SMTP 服务器可以立即报告(回复 SMTPRCPT TO命令)是否将电子邮件发送给该收件人。TIdSMTP可以通过TIdSMTP.OnFailedRecipient事件或引发异常向您的代码报告此类错误。

但是,如果电子邮件无法立即发送给收件人,则必须异步发送,通常是通过中继到另一台服务器(可能多次),并且在您将电子邮件发送给初始服务器之后才会进行发送并继续前进。

因此,在交付期间发生的错误无法由 报告TIdSMTP。无法传送电子邮件的 SMTP 服务器(可能是您连接的同一台服务器,也可能是将电子邮件中继到的另一台服务器)将向原始发件人的收件箱发送一封电子邮件,说明发生的错误.

因此,要检测此类错误,您必须定期检查收件箱,例如使用 POP3 或 IMAP,然后解析电子邮件以获取详细信息。并且此类错误可能需要一些时间才能到达,具体取决于错误的性质、给定服务器在放弃之前重试的时间等。因此,可能需要几分钟、几小时甚至几天才能获得响应,如果有的话。

通常,没有单一可靠的方法可以及时了解给定的收件人是否有效。您应该让 SMTP 完成其工作并异步处理错误。

但是,如果您必须进行验证,一种方法是使用TIdDNSResolver查找收件人域的 MX 记录,然后连接TIdSMTP到该域服务器并调用TIdSMTP.Verify()以检查收件人是否存在于这些服务器上。但这需要服务器实现 SMTPVRFY命令,这是 SMTP 协议规范可选的,现代服务器可能不会实现,以避免泄漏知识,并堵塞漏洞漏洞。