【问题标题】:Why can't I know whether sending a mail fails?为什么我不知道发送邮件是否失败?
【发布时间】:2015-02-18 02:01:41
【问题描述】:

我正在实施一个 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 没有?他们有什么不同?

【问题讨论】:

    标签: .net smtp smtpclient email-validation


    【解决方案1】:

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

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

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

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

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

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

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

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

    如果您需要响应,则必须直接连接到目标服务器并在那里发出SMTP 命令。在这种情况下,您可能会也可能不会收到回复。这在您链接到的线程中也得到了明确的回答。作为一种反垃圾邮件措施,几乎所有的服务器都采用缓送(也就是延迟或黑洞)来防止其用户被枚举。

    发送邮件到“someone@example.com”或“noone@nowhere.xyz”都没有关系,只要是外部服务器。我上面给出的插图过于简化。实际上,可能有几个中介服务可以为您的电子邮件服务器解析 DNS。

    你举了“http://verify-email.org/”的例子。但是,您是否阅读了它主页上的内容?

    这个电子邮件验证工具实际上连接到邮件服务器,并且 检查邮箱是否存在。

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

    此外,该服务的主页显示:

    正在验证的内容:格式:“name@domain.xxx”;有效域: “somebody@new.york”无效;有效用户:验证是否是用户;和 邮箱真的存在

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

    请记住,即使此服务也无法准确地告诉您对于所有电子邮件服务的用户的存在您想要什么。例如,我在我的电子邮件服务器上使用了缓送,因此即使这个服务也无法告诉你我是否存在。我的邮件服务器永远不会响应。 “verify-email.org”将始终为您返回ok

    顺便说一句:“verify-email.org”通常会将其返回给您:

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

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

    希望对您有所帮助。

    .

    【讨论】:

    • 谢谢,现在我明白是怎么回事了。我想最好不要担心我系统中的失败收件人,让邮件服务自己处理。
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2014-04-08
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多