我的应用会向指定地址发送电子邮件,这样可以正常使用。问题是,这些电子邮件地址之一可能不正确而且不存在。我正在使用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帐户中,我收到了电子邮件,例如"地址未找到"如果我尝试发送电子邮件到错误的地址。
由于
答案 0 :(得分:4)
当您向SMTP服务器发送电子邮件时,您所做的一切都会通过电子邮件发送给服务器,并报告它是否会尝试将其发送给指定的收件人。无法保证交货。
如果给定的收件人是该服务器/域的本地收件人,则接收SMTP服务器可以立即报告(回复SMTP RCPT TO
命令)是否将电子邮件发送给该收件人。 TIdSMTP
可以通过TIdSMTP.OnFailedRecipient
事件或通过引发异常向代码报告此类错误。
但是,如果电子邮件无法立即发送给收件人,则必须异步发送,通常是通过中继到另一台服务器(可能多次),并且直到您发送电子邮件后才发送初始服务器并继续前进。
因此,TIdSMTP
无法报告在该传递过程中发生的错误。无法发送电子邮件的SMTP服务器(可能是您连接的同一服务器,或者可能是电子邮件中继到的另一台服务器)将向原始发件人的收件箱发送电子邮件,说明发生的错误
因此,要检测这类错误,您必须定期检查收件箱,例如使用POP3或IMAP,然后解析电子邮件以获取详细信息。这些错误可能需要一些时间才能到达,具体取决于错误的性质,给定服务器在放弃之前重试的时间等等。因此,可能需要几分钟,几小时甚至几天才能得到回复,如果有的话。
通常,没有单一可靠方式来了解给定收件人是否及时有效。您应该让SMTP执行其工作并异步处理错误。
但是,如果您必须验证,一种方法是使用TIdDNSResolver
查找收件人域的MX记录,然后将TIdSMTP
连接到该域服务器并调用TIdSMTP.Verify()
检查这些服务器上是否存在收件人。但这需要服务器实现SMTP VRFY
命令,该命令是SMTP协议规范的可选命令,现有服务器可能无法实现,以避免泄漏知识,并堵塞漏洞漏洞。
答案 1 :(得分:-2)
我不确定您是否知道地址是否存在,因为在gmail中您发送了一封电子邮件,谷歌服务器会回答您它并不存在。
使用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;