我正在尝试使用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
组件正确发送消息吗?
答案 0 :(得分:1)
TIdSMTPRelayStatusItem.Sent
属性会告诉您TIdSMTPRelayStatusItem.EmailAddress
属性中指定的收件人的SMTP服务器是否接受了该电子邮件。这并不能告诉您电子邮件是否实际发送给收件人本身。 SMTP协议不向发件人提供该信息。 SMTP服务器可以接受收件人的电子邮件,然后必须在后台转发/中继到另一个SMTP服务器。了解电子邮件是否已发送给收件人的唯一方法是收件人自己是否将确认电子邮件发送回发件人的邮箱。
如果TIdSMTPRelayStatusItem.Sent
属性为False,则表示在传递到收件人的SMTP服务器期间引发了异常。 Message
属性中提供了TIdSMTPRelayStatusItem.ExceptionMessage
异常。如果由于SMTP服务器发送的错误消息而引发异常,则还会填充TIdSMTPRelayStatusItem.ReplyCode
和TIdSMTPRelayStatusItem.EnhancedCode
属性。无论哪种方式,您还会收到一个TIdSMTPRelay.OnDirectSMTPStatus
事件,其Action
参数设置为dmWorkEndWithException
而不是dmWorkEndOK
。
因此,电子邮件可以传递给给定收件人但其Sent
值为False的唯一方法是:
SMTP服务器接受了该电子邮件,但发送了错误回复给TIdSMPTRelay
在交付成功之后但在创建/填充Sent=True
状态项之前,会引发未捕获的异常。