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

时间:2017-10-27 13:26:08

标签: email delphi 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

如何查看电子邮件是否已发送?在我的测试Gmail帐户中,我收到了电子邮件,例如"地址未找到"如果我尝试发送电子邮件到错误的地址。

由于

2 个答案:

答案 0 :(得分:4)

当您向SMTP服务器发送电子邮件时,您所做的一切都会通过电子邮件发送给服务器,并报告它是否会尝试将其发送给指定的收件人。无法保证交货。

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

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

因此,TIdSMTP无法报告在该传递过程中发生的错误。无法发送电子邮件的SMTP服务器(可能是您连接的同一服务器,或者可能是电子邮件中继到的另一台服务器)将向原始发件人的收件箱发送电子邮件,说明发生的错误

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

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

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

答案 1 :(得分:-2)

我不确定您是否知道地址是否存在,因为在gmail中您发送了一封电子邮件,谷歌服务器会回答您它并不存在。

使用Send方法,您可以通过服务器SMTP获得错误返回,例如"地址无效","套接字错误",..但没有关于收件人。

如果收件人的SMTP检测到错误,您用来发送邮件的电子邮件将会收到回复。

在我的代码中我也使用了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;