【问题标题】:Check if mail is sent with TIdSmtpRelay and handle error if not检查邮件是否使用 TIdSmtpRelay 发送,如果没有则处理错误
【发布时间】:2015-05-13 04:38:11
【问题描述】:

我正在尝试使用IndyTIdSMTPRelay 组件发送邮件,这是我使用的过程:

procedure tryRelayTask;
var
  relayMsg : TIdMessage;
  LRelayRecipients: TIdEMailAddressList;
  LRelay : TIdSmtpRelay;
  SSLHandler : TIdSSLIOHandlerSocketOpenSSL;
begin
  relayMsg := TIdMessage.Create;
  relayMsg.LoadFromFile(mailFileName);
  try
    LRelayRecipients := TIdEMailAddressList.Create(nil);
    try
      LRelayRecipients.Add.Address := recipientEmailAddress;
      LRelay := TIdSMTPRelay.Create(nil);
      try
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create;
        try
          SSLHandler.SSLOptions.KeyFile := myKeyFile;
          SSLHandler.SSLOptions.CertFile := myCertFile;
          SSLHandler.SSLOptions.RootCertFile := myRootCertFile;
          LRelay.IOHandler := SSLHandler;
          LRelay.SSLOptions.SSLSupport := SupportSSL;
          LRelay.DNSServer := myRelayDNSServer;            
          LRelay.Send(relayMsg, LRelayRecipients) ;
          if Lrelay.StatusList.Items[0].Sent then begin
            // message is sent ok ?
          end
          else begin
            // message is not sent ok - handleError
            handleRelayError(LRelay.StatusList.Items[0].ExceptionMessage);
          end;
        finally
          SSLHandler.Free;
        end;
      finally
        LRelay.Free;
      end;
    finally
      LRelayRecipients.Free;
    end;
  finally
    relayMsg.Free;
  end;
end;

有时Lrelay.StatusList.Items[0].Sent 属性是False,但消息实际上已发送,因此如果我再次尝试发送它,我最终会成功发送它N 次而不是只有 1 次。有人可以帮我发送使用TIdSMTPRealy 组件正确发送消息?

【问题讨论】:

  • Sent 为 false 时,ExceptionMessage 的实际值是多少?
  • ExceptionMessages 的值如下所示:无法连接到地址 xyz@xyz.com 的 MX 服务器
  • 该特定错误意味着 TIdSMTPRelay 能够查询 DNS 以获取 xyz.com 域的 MX 记录(SMTP 服务器 IP),但无法连接到任何报告的服务器,或协商与其中任何一个的 SSL/TLS 会话。如果TIdSMTPRelay 能够连接到服务器,但无法向其发送电子邮件,您将收到不同的错误消息。另外,我刚刚发现TIdSMTPRelay 可以为单个地址创建多个状态项,因此请务必考虑到这一点。

标签: email delphi smtp indy


【解决方案1】:

TIdSMTPRelayStatusItem.Sent 属性告诉您电子邮件是否被TIdSMTPRelayStatusItem.EmailAddress 属性中指定的收件人的 SMTP 服务器接受。这并不能告诉您电子邮件是否实际发送给收件人本身。 SMTP 协议不向发件人提供该信息。 SMTP 服务器可以接受收件人的电子邮件,然后它必须在后台转发/中继到另一个 SMTP 服务器。了解电子邮件是否已送达收件人的唯一方法是收件人自己是否将确认电子邮件发送回发件人的邮箱。

如果 TIdSMTPRelayStatusItem.Sent 属性为 False,则表示在传递到收件人的 SMTP 服务器期间引发了异常。异常的MessageTIdSMTPRelayStatusItem.ExceptionMessage 属性中可用。如果由于 SMTP 服务器发送错误消息而引发异常,则还会填充 TIdSMTPRelayStatusItem.ReplyCodeTIdSMTPRelayStatusItem.EnhancedCode 属性。无论哪种方式,您还将获得一个TIdSMTPRelay.OnDirectSMTPStatus 事件,其Action 参数设置为dmWorkEndWithException 而不是dmWorkEndOK

因此,电子邮件可以发送给给定收件人但其 Sent 值为 False 的唯一方法是:

  1. SMTP 服务器接受了电子邮件,但将错误回复发送回TIdSMPTRelay

  2. 在交付成功后但在 Sent=True 状态项可以创建/填充之前引发了未捕获的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2018-05-04
    • 2017-12-06
    • 2021-03-13
    相关资源
    最近更新 更多