检查邮件是否与TIdSmtpRelay一起发送,如果没有则处理错误

时间:2015-03-11 11:44:53

标签: email delphi smtp indy

我正在尝试使用TIdSMTPRelay的{​​{1}}组件发送邮件,这是我使用的程序:

Indy

有时,属性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次,而不是仅发送1次。有人可以帮助我使用N组件正确发送消息吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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