为什么我不知道发送邮件是否失败?

时间:2014-12-19 06:38:01

标签: .net smtp smtpclient email-validation

我实施了一个CRM,我需要向客户发送邮件。当然,我发现了许多人似乎发现的问题:你不知道邮件是否成功发送。但是,我似乎并不明白为什么会这样。

首先,我了解对电子邮件的测试只能通过实际与服务器通信来控制电子邮件(使用MX记录,然后使用MAIL FROMRCPT TO命令),甚至是然后服务器可能拒绝回答这些请求。我认为我已经明确了,例如http://verify-email.org/之类的网站看起来如何运作。

然后,我从this comment读到这里的答案,即.NET SmtpClient做同样的事情来验证消息是否可以发送,如果它失败则抛出一个SmtpFailedRecipientsException。所以我好像得到了......

但是,我决定尝试向无效地址发送邮件:asdf@asdf.asdf(我希望.asdf不是最近批准的新TLD之一)。我在http://verify-email.org/上使用它并且它说它无效(因为显然甚至没有MX记录),但是当我使用SmtpClient时它会成功!为什么呢?

然后我读了this other question(我意识到我不是第一个问这个的人),它说SMTP是一个“存储转发”协议(意味着它可能不会尝试发送消息)我也明白了......但与此同时我发现自相矛盾。

asdf.asdf如果信息甚至不存在,如何存储和转发信息?为什么http://verify-email.org/(以及其他网络服务,我没有尝试过这个服务)会立即得到响应而SmtpClient没有?他们有什么不同的做法?

1 个答案:

答案 0 :(得分:2)

让我们了解邮件是如何流动的(过度简化):

Your App > Your Mail Server > Destination Mail Server > Recipient
               |                                          ^
               |                                          |
               + ---- if recipient on the same server ----+

因此,当您向同一服务器上的收件人发送邮件时,例如,如果与Exchange Server位于同一域中,则服务器会知道您的收件人是否存在,并且可以立即回复给你。

但是,当您向外部收件人发送邮件时,您的服务器会将电子邮件转发到邮件服务器(由域名的MX记录标识)。当发生这种情况时,会发生两件事:

  1. 您的服务器很乐意接受您,并立即向您发送接受交付确认
  2. 然后它尝试根据当前队列
  3. 将邮件转发到外部服务器

    在队列清除并实际发送消息之前,它不会让您的应用无限期地等待。如果这样做,你的应用程序有可能等待长达4天!

    关于您链接的其他问题/答案,他们假设收件人位于同一台服务器上。

    通常,当您通过应用使用smtpClient发送邮件时,您无法直接连接到收件人的服务器。您可以使用智能主机或自己的邮件服务器。您对服务器进行身份验证,然后中继您的邮件。使用VRFY和/或RCPT TO的方法将对您的服务器起作用。只要收件人位于同一台服务器上,您(smtpClient就此而言)将对您自己的服务器起作用,并且可以响应。但是,当您为外部服务器转发邮件时,您的服务器将只接受您的邮件而无法回复。

    如果您需要响应,则必须直接连接到目标服务器并在那里发出SMTP命令。在这种情况下,您可能会或可能不会收到回复。在您链接的主题中也清楚地回答了这一问题。作为一种反垃圾邮件措施,几乎所有服务器都使用缓存(换句话说是延迟或黑洞)来防止其用户的枚举。

    如果您要向" someone@example.com "发送邮件,这并不重要。或" noone@nowhere.xyz ",只要它是外部服务器。我上面给出的插图过于简化了。实际上,可能有多个中介服务可以解析您的电子邮件服务器的DNS。

    您举了" http://verify-email.org/ "的例子。但是,您是否在其主页上阅读了它所说的内容?

      

    此电子邮件验证工具实际上连接到邮件服务器和   检查邮箱是否存在。

    其中,表示它直接连接到您尝试向其发送邮件的域的MX服务器。即使你可以做到这一点。唯一不同的是,在现实生活中,我们的应用程序无法做到这一点。您连接到本地smarthost / relay。

    此外,该服务的主页说:

      

    正在验证的内容:格式:" name@domain.xxx" ;;有效域名:   " somebody@new.york"无效;有效用户:验证用户;和   邮箱确实存在

    这意味着,在尝试连接到目标服务器之前,此服务会检查格式(可能是正则表达式),然后执行DNS查找以检查域是否有效,然后尝试连接到目的地服务器之后。

    请记住,即使是这项服务也无法准确地告诉您所有电子邮件服务的用户存在。例如,我在我的电子邮件服务器上使用了tarpitting,因此即使这项服务也无法告诉你我是否存在。我的邮件服务器永远不会响应。 " verify-email.org "我会一直向你回复ok

    BTW :" verify-email.org "通常会将此归还给您:

    550 5.7.1 Service unavailable; Client host [verify-email.org] blocked using Spamhaus;
    

    此服务已被多家反垃圾邮件服务提供商阻止!!

    希望有所帮助。