如果只有一个电子邮件地址不正确,为什么IdSMTP.Send会失败?

时间:2014-02-04 21:49:12

标签: delphi smtp indy

我正在使用Indy和Delphi发送电子邮件。在最近有一位用户放手之前,我没有遇到任何问题。他们的电子邮件帐户已被删除,我的程序尝试通过电子邮件向大约七位用户发送电子邮我希望SMTP服务器接受电子邮件并将邮件传递给有效用户,然后将电子邮件发送回发件人,通知他们收件人列表中的一个帐户不再有效。

相反,SMTP服务器不接受任何内容,也没有人收到该消息。我的日志中有“邮箱不可用”。是否有设置可以改变我的行为?像Outlook这样的电子邮件客户端当然不会这样做。

具体来说,发送邮件的正确方法是什么,以便收件人列表中的所有有效电子邮件地址都能得到传递,并且SMTP服务器会通知发件人任何不正确的地址?

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果您使用的是Indy 10,则需要为TIdSMTP.OnFailedRecipient事件分配一个处理程序,并将VContinue参数设置为True。

procedure TForm1.IdSMTP1FailedRecipient(Sender: TObject; const AAddress, ACode,
  AText: string; var VContinue: Boolean);
begin
  // do something...
  VContinue := True;
end;

这将允许TIdSMTP跳过失败的收件人并继续将电子邮件发送给其余收件人。只有当所有收件人都失败时TIdSMTP才会失败发送(除非发生其他一些非收件人错误)。

如果您使用的是Indy 9或更早版本,或者未提供OnFailedRecipient处理程序,TIdSMTP将失败并在遇到第一个错误时中止发送,包括收件人错误。

如果发件人在电子邮件仍在向服务器发送过程中,如果SMTP服务器主动拒绝给定的收件人,则SMTP服务器将向收件人的收件箱发送通知。您必须使用OnFailedRecipient事件对该收件人采取行动。只有服务器接受然后发现有错误的收件人才会相应地向发件人的收件箱发送通知。这就是SMTP的工作原理。