.net 为什么可以';我不知道发送邮件是否失败吗?

.net 为什么可以';我不知道发送邮件是否失败吗?,.net,smtp,smtpclient,email-validation,.net,Smtp,Smtpclient,Email Validation,我正在实施一个CRM,在这里我需要向客户发送邮件。当然,我发现了很多人似乎都发现的问题:你不知道邮件是否成功发送。然而,我似乎不太明白为什么会这样 首先,我明白,只有通过实际与控制电子邮件的服务器对话(使用MX记录,然后使用邮件FROM和RCPT to命令),才能完成电子邮件测试,即使如此,服务器也可能拒绝回答这些请求。我想我已经很清楚了,例如,这就是网站喜欢的工作方式 然后,我从读到这里的一个答案,.NET的SmtpClient做同样的事情来验证消息是否可以发送,如果失败,它会抛出一个Smtp

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

首先,我明白,只有通过实际与控制电子邮件的服务器对话(使用MX记录,然后使用
邮件FROM
RCPT to
命令),才能完成电子邮件测试,即使如此,服务器也可能拒绝回答这些请求。我想我已经很清楚了,例如,这就是网站喜欢的工作方式

然后,我从读到这里的一个答案,.NET的
SmtpClient
做同样的事情来验证消息是否可以发送,如果失败,它会抛出一个
SmtpFailedRecipientsException
。所以我似乎明白了

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

然后我读到(我意识到我不是第一个问这个问题的人)其中说SMTP是一种“存储转发”协议(意味着它可能不会立即发送消息),我也理解。。。但同时我发现矛盾


当消息根本不存在时,如何存储和转发它?为什么(以及其他web服务,我没有只尝试这一个)会得到即时响应,而
SmtpClient
没有?他们的做法有什么不同?

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

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

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

  • 您的服务器很乐意接受您的请求,并立即向您发送一个已接受的发送确认
  • 然后,它尝试根据其当前队列将邮件转发到外部服务器
  • 它不会让你的应用程序无限期地等待,直到队列清空并实际发送消息。如果真是这样的话,你的应用程序可能会等待长达4天

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

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

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

    无论您是否将邮件发送到“someone@example.com“或”noone@nowhere.xyz,只要它是外部服务器。我上面给出的例子过于简化了。实际上,可能有几种中介服务为您的电子邮件服务器解析DNS

    您给出了“”的示例。但是,你读过它在主页上的内容吗

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

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

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

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

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

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

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

    550 5.7.1 Service unavailable; Client host [verify-email.org] blocked using Spamhaus;
    
    此服务已被多个反垃圾邮件服务提供商阻止

    希望有帮助


    .

    谢谢,现在我明白发生了什么事。我想最好不要担心我系统中失败的收件人,让邮件服务自己处理。
    550 5.7.1 Service unavailable; Client host [verify-email.org] blocked using Spamhaus;