2014-12-19 97 views
0

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

首先,据我了解,测试的邮件只能通过实际交谈服务器在电子邮件的控制(使用MX记录,然后MAIL FROMRCPT TO命令),即使这样的服务器可能会拒绝回答完成这些请求。我想我已经清楚了,例如,看起来像http://verify-email.org/这样的网站似乎有效。

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

但是,然后,我决定尝试发送邮件到一个无效的地址:[email protected](我希望.asdf不是最近批准的新顶级域名之一)。我在http://verify-email.org/上使用它,它说它是无效的(因为甚至没有MX记录,显然),但是当我使用SmtpClient它成功!为什么?

然后我读this other question(我意识到我不是第一个问这个问题),它说SMTP是一个“存储和转发”协议(意思是它可能不会立即发送消息),我也是理解......但同时我觉得自相矛盾。

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

回答

2

我们先来了解邮件如何流动(过于简化):

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

所以,当你发送邮件给收件人谁是在同一台服务器上,例如,如果在相同的域名Exchange Server在内部,则服务器知道您的收件人是否存在,并且可以立即回复您。

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

  1. 您的服务器欣然接受它出自于你,并把你的接受交付ACK立即
  2. ,然后尝试基于其当前队列中的邮件转发到外部服务器

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

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

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

如果您需要回应,那么您将不得不直接连接到目标服务器,并在那里发出SMTP命令。在这种情况下,您可能会收到回复,也可能不会收到回复。这也已在您链接的主题中得到明确回答。作为一种反垃圾邮件措施,几乎所有服务器都使用tarpitting(换句话说,延迟或黑洞)来防止列举其用户。

如果您要发送邮件给“[email protected]”或“[email protected]”,只要它是一个外部服务器没关系。我上面给出的例子过于简单。实际上,可能有几种中介服务为您的电子邮件服务器解析DNS。

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

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

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

此外,该服务的主页上说:

什么正在验证:格式: “[email protected]”;有效域名: “[email protected]”无效;有效的用户:验证用户;和 邮箱确实存在

这意味着,尝试连接到目标服务器之前,该服务不会对格式进行检查(可能是一个正则表达式),然后就检查DNS查找如果域名是有效或而不是,然后才尝试连接到目标服务器。

请记住,即使此服务也无法准确告诉您所有电子邮件服务的用户是否存在。例如,我已经在我的电子邮件服务器上使用了tarpitting,因此即使此服务也无法告诉您我是否存在。我的邮件服务器永远不会回应。 “verify-email.org”将始终返回ok给你所有的东西。

BTW:“verify-email.org”将更多的往往不是这回你:

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

此服务已被屏蔽一些反垃圾邮件服务商!

希望有所帮助。

+0

谢谢,现在我明白发生了什么。我想最好不要担心来自我的系统的失败收件人,并让邮件服务自己处理它。 – 2014-12-19 18:25:07

相关问题