我正在使用 django。我只是想知道是否可以检查一封电子邮件是否正确,以便它一定会送达(99.99%)?如果用户输入了类似 的电子邮件klsdfksdajkfdn@skjdnf.com
,从技术上讲,它是有效的电子邮件,但实际上并不存在。我可以检测到此类电子邮件吗?
4 回答
我认为实现这一目标的唯一方法是提供一种机制,让您向其发送电子邮件的用户收到请求确认的链接。就像您订阅了许多网站一样。通过这个用户确认它是一个有效的电子邮件,然后你可以“信任”
您无法在发送之前或之后检查电子邮件。但是你可以做一些可能覆盖 80% 的事情。
- 您可以检查域。例如,如果用户给出的电子邮件是
foo@gmail.com
first pinggmail.com
。如果它不存在,则可能是电子邮件错误的第一个危险信号。但要小心:可能该域的 ICMP 已被阻止。 - 您可以收听自动回复消息,并尝试区分那些告诉您电子邮件不存在的消息。这是为了在域名正确时检测错误的用户名。但要小心:可能存在误报(如果您将外出回复识别为电子邮件不存在)或误报(如果您错过自动回复,因为它不包含预期的单词或用意想不到的语言写的)
IOException
如果您因为或类似的东西被抛出而无法发送电子邮件。但同样要小心:这可能意味着来自另一端的邮件服务器暂时不可用,或者您的计算机存在连接问题。
如果您的意思是电子邮件未送达报告或“退回邮件”,那么跟踪它们并不是 Django 的权限范围。消息本身就是电子邮件,由邮件守护进程存放在您的邮箱中,因此您需要正确配置您的邮件服务器并处理通过除 Django 之外的某个系统传入的邮件。
如果您的意思是跟踪电子邮件的实际发送,则没有好的选择。“已读回执”仅由某些电子邮件客户端以不兼容的方式处理,所有这些都可能是基于电子邮件的,因此不会访问网络服务器。您可以嵌入具有唯一 URL 的图像(跟踪图像)并使用 Django 跟踪谁访问它,但是因为这有点侵犯隐私,一些电子邮件客户端(如 gmail)会阻止这些图像的加载(实际上,所有图像) 默认。
检查电子邮件是否正确同样复杂。您可以通过尝试直接查询该域的邮件服务器轻松确定地址的域部分是否真实,但只有一些邮件服务器会报告名称是否有效,而有些则不会。
到目前为止,最好的方法是简单地发送一封确认电子邮件并要求用户通过单击一个独特的链接来回复它,这会导致一个 Django 页面,该页面标记该电子邮件绝对正确。事实上,大多数使用电子邮件通信的网站都是这样做的。如果您只想要此功能而不需要其他与电子邮件/帐户相关的功能,请查看http://code.google.com/p/django-email-confirmation/
我认为使用当前一代的电子邮件传输协议(即 SMTP)不可能有可靠的解决方案。几乎任何你能想到的尝试都被复杂性和“失败”案例所困扰,这些案例会给你带来误报或误报。
即使您甚至(似乎)将电子邮件发送到目标邮件服务器,您也无法知道它是否会发送给任何人......更不用说合适的人了。您甚至不能依赖目标服务器告诉您它无法交付。
实际上,您可能最好对电子邮件地址进行语法检查,并且(也许)查看电子邮件地址的域部分是否存在 DNS 条目。
请注意,在邮件传递中发生的许多混淆都是为了阻止垃圾邮件发送者。