我希望能够判断发送给用户的电子邮件是否成功。
我尝试查看 SMTP 日志,似乎无法将服务器请求与服务器响应联系起来。因此,如果我收到错误 550,并且尝试的地址未包含在响应中,则我无法知道失败的地址或请求。
在日志或发送的代码中寻找解决方案。
答案1
一些背景信息:
如果邮件无法送达,正确配置的服务器应该立即通知您。
irc:最初 SMTP 服务器会这样做,但后来它被认为是一个安全漏洞,会泄露系统中是否存在用户,因此他们开始接受所有邮件,然后将其退回。但垃圾邮件发送者会使用退回来发送垃圾邮件,方法是“将其退回到垃圾邮件目标”。所以现在我们又回到了根据中继规则立即拒绝电子邮件的状态。
这意味着在大多数情况下你能确定电子邮件是否已送达。但前提是您直接与接收方的电子邮件服务器通信。这意味着您的应用程序需要做很多工作:MX 查找、TCP 连接到可能使用慢速的服务器焦油坑所以它非常慢,处理超时等。问题是你不能很好地处理暂时宕机的服务器。
如果您将电子邮件发送到中继服务器(如本地 IIS SMTP 服务器或 ISP),那么检测退回的唯一方法是在邮件中设置退回标头并检查退回邮件的退回帐户。这种方法并不罕见。但是,所有退回邮件可能需要长达(甚至超过)5 天的时间才能恢复,具体取决于链下 SMTP 服务器上的重试设置。
这个问题通常可以通过在消息中添加图片的 URL 来解决。当用户点击“下载内容”时,图片就会被下载,然后您就可以确认接收了。图片可以是http://server.com/[电子邮件保护]或者它可能是您制作的使用 Response.SendFile 发送图像的 aspx 页面(您可能也想在 Response.Header 中设置 Content-Type)。
答案2
我知道的唯一方法是绕过 IIS 的 SMTP 服务器并直接发送。你可以在 Google 上搜索并找到一些可以为你完成此操作的组件,否则这里有一个原始链接TCP 版本:
当然,这并不意味着邮件已收到/送达或未被退回。这仅意味着 MX 记录中列出的 SMTP 接受了该邮件。它可能已将其丢弃,可能稍后将其退回,也可能将其传递给用户。