检测过期的电子邮件地址?

时间:2012-01-19 21:24:56

标签: php email

  

可能重复:
  How to check if an email address exists without sending an email?

  

可能重复:

     

How to check if an email exists without sending an email?

我有一个非常大的用户数据库(超过50000),网站发送了大量自动电子邮件。

问题是,数据库中的很多地址(多年前注册的用户)已经过期或已被删除或因任何原因不再存在。

这会产生问题,因为每个用户都应该有一封有效的电子邮件。

我一直试图找出是否有办法检测电子邮件地址是否有效,这样我们就可以更新数据库并提示这些用户输入新的电子邮件?像ping电子邮件地址的东西?

这里有一些代码,我试图找出但无济于事:

http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/smtpvalidateclassphp/

有没有人有解决方案?

请注意,我需要一个PHP解决方案,而不是命令行,因为我有50k的电子邮件需要检查。

2 个答案:

答案 0 :(得分:2)

首先,您应该通过实施“闭环”电子邮件验证系统来阻止可能无效的电子邮件地址的涌入。基本上,当用户注册您的网站时,您会发送一封电子邮件,其中包含确认其电子邮件地址的链接,一旦他们确认,他们的帐户就可以完全访问您的网站。

其次,没有真正的方法来确定电子邮件地址是否严格使用PHP无效。几个月前我不得不解决这个问题,最后我们使用邮件服务器告诉我们电子邮件地址是否已被退回。当您的邮件服务器发送电子邮件,并且无法发送电子邮件时,收件人邮件服务器将通过退回通知回复您的邮件服务器,其中包含有关电子邮件被退回的原因的信息。传递状态通知(DSN)代码等信息,用于识别无法传递电子邮件地址的原因。

一些示例代码:

  • 511:Bad Mailbox
  • 512:Bad System
  • 516:邮箱移动

这些代码由前缀(4或5)组成,表示瞬态(临时)或永久性故障。以下两位数代码表示误差范围; 10到19之间的两位数字代码表示与电子邮件地址有关的错误,而20到29之间的代码表示与电子邮箱相关的错误。

根据这些代码,您可以根据业务需求确定“硬弹跳”或“软弹跳”。硬弹跳会像511(坏邮箱),确定此电子邮件地址目前无效。软弹跳会像445(网络拥挤),这表明这是一个临时问题,为什么电子邮件无法传递。

因此,在您的实例中,您可以发送电子邮件,然后跟踪邮件服务器上的跳出。通过查看每个退回和相应的DSN代码,您可以标记帐户的电子邮件是否有效(我们使用PHP来访问邮件服务器并解析DSN代码的退回通知)

DSN代码中有更多information

- 编辑 -

正如Dagon明智地提到的那样,您可以在收到电子邮件后将其反弹到PHP脚本中。为此,您需要阅读mailserver配置,但我们的内容类似于以下内容:

bouncehandler   unix    -       n       n       -       -       pipe
user=nobody argv=/usr/bin/php /path/to/BounceHandler.php
<% end %>

答案 1 :(得分:1)

检查电子邮件地址是否过期的唯一方法是向其发送电子邮件,看看是否收到回复。但请注意,这样做可能会被视为垃圾邮件,因为它是一封未经请求的邮件。

您可以检查一个电子邮件地址是否正确形成,以及它指定的邮件服务器是否确实存在,但那是关于它的。我没有办法检查帐户是否存在(如果有人正在阅读那里发送的邮件),而不发送带有链接的邮件并要求用户点击该链接。