【问题标题】:Check if email was sent -- Delphi Indy10检查是否发送了电子邮件——Delphi Indy10
【发布时间】:2018-04-09 03:01:30
【问题描述】:

我的应用程序将电子邮件发送到给定的地址,这工作正常。问题是,这些电子邮件地址之一可能不正确且不存在。我正在使用 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 帐户中,如果我尝试将电子邮件发送到不正确的地址,我会收到类似“找不到地址”的电子邮件。

谢谢

【问题讨论】:

    标签: email delphi indy delphi-2009 indy10


    【解决方案1】:

    当您向 SMTP 服务器发送电子邮件时,您实际上所做的只是将电子邮件发送到服务器,然后它会报告是否会尝试将其发送给指定的收件人。不保证交货。

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我不确定您是否可以知道地址是否存在,因为在 gmail 中您发送了一封电子邮件,而 google 服务器回答您该地址不存在。

      使用 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;
      

      【讨论】:

      • TIdSMPT 有一个事件 OnFailedRecipient,但是当我设置断点时程序没有进入那里。我没有 EIdSMTPReplyError。我应该在使用列表中添加什么?
      • 您需要添加使用IdReplySMTP。如果我是对的 OnFailedRecipient 与您的服务器接受的收件人一起工作,那么如果收件人不存在,那将不会失败。如果他不存在,您稍后会收到一封错误电子邮件。
      • 非常感谢,但这并没有太大变化。当我没有收到任何回复时,如果他写了错误的地址,我无法以任何方式告诉用户。
      • 收到的邮件将来可能会更改,因此编写一个正确的程序是相当不可能的。你能告诉我一些架构如何做到这一点吗?
      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2012-05-16
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多