确认一个 Email 地址是否存在

前些天做销售的同事给我出了个题目: 她的客户数据里有很多的 Email 地址都是过期的或者错误的, 因此群发发邮件时会收到很多退信. 但是由于数量较大, 又不好手工去一一找出哪些地址是无效的. 有没有可能用程序解决呢?

当然是可能的啦, 思路: 首先肯定不能通过发邮件来测试, 因为, 乱发垃圾邮件那是违法的. 于是我采取三个步骤:

  1. 利用 regex 从 Email 地址的格式上先淘汰一些, 例如连 @ 都没有的那肯定不是合格的 Email 地址.
  2. 再从 DNS MX 记录上淘汰一些. 如果某域名没有有效的 MX 记录, 那该域名结尾的任何 Email 地址都是无效的.
  3. 最后使用 SMTP 协议”假装”发邮件, 只查询收件人是否存在, 便挂断.

基本能够达到目的, 但不保证 100% 准确. 因为… 很多发垃圾邮件的专业户也是这么做的, 所以一些邮件服务器对此是提防的. 程序如下.

require 'net/smtp'
require 'dnsruby'
class EmailValidator
 def check_format(email)
   m =  /^[A-Za-z0-9._%+-][email protected]([A-Za-z0-9.-]+\.[A-Za-z]{2,4})$/.match email
   if m
     @domain = m[1]
     @email = email
   else
     puts "Invalid Email address for '#{email}'."
     return false
   end
 end

 def mx_lookup
   res = Dnsruby::Resolver.new
   ret = res.query(@domain, Dnsruby::Types.mx)

   return ret.answer[0].exchange.to_s if ret && ret.answer && ret.answer[0]
 end

 def validate(email)
   return false unless check_format(email)

   mx = mx_lookup()
   if mx
     Net::SMTP.start(mx, 25) do |smtp|
       smtp.helo 'the.domain.name'
       smtp.mailfrom 'sender.email.address'
       smtp.rcptto @email
       smtp.finish
     end
     puts "Account exists for '#{@email}'."
     return true
   else
     puts "No MX available for '#{@domain}'."
     return false
   end
 rescue => err
   puts "Account may not exist for '#{@email}'."
   puts err
   return false
 end
end

🙂

继续:中国特色SMTP现象

转发21cn.com的公开信:

尊敬的21CN邮箱用户:
您好!
我们监测到目前互联网国际出口存在未知的技术问题,直接影响到与国外及港台地区的邮件通信,
情况包括发往国外及港台地区的邮件、国外及港台地区发进来的邮件都可能出现类似以下的退信:
1、21CN邮箱发往国外域不成功,收到系统的退信提示为:“551 User not local; please try<forward-path> (in reply to RCPT TO command)”,或收到的邮件内容变为:“aaazzzaaazzz”。

2、国外用户发给21CN邮箱,发信人收到退信,退信提示为:“551 User not local; please try<forward-path> (in reply to RCPT TO command)”或收到的邮件内容变为:“aaazzzaaazzz”。

由于目前这种网络异常的情况官方及相关的互联网组织并未作出具体的公告说明,我们曾向中国互联网信息中心及同行的其它服务商了解了情况,这情况都普遍存在。目前我司正在积极向相关互联网机构和主管部门反映该问题,在此问题得到妥善解决后我们会第一时间通知您!

可以尝试的解决方法:

可以尝试将邮件正文的内容拷贝到WORD文档中并压缩为RAR或ZIP文件后,以附件的形式发送(尽量正文不带任何内容)。

由此给您带来的不便,请谅解!

官方与神秘的“相关互联网组织”啊,你们放过我们这些网民吧,每次发信都rar、zip的,很不方便啊。

其实不止是中国人,很多“出差”到中国的外国朋友也有幸体会到了这种中国特色了。记得上个月BIRTV上,一个加拿大朋友就说了,进了中国,就收不到家书了。他本人是做技术的,非常喜欢“troubleshooting”,于是做了多种测试,结论是一封无正文或者仅仅一句“this is a test”的邮件可以很顺利的“入境” 。看来和21cn.com的判断不谋而合了。另外,他说“丢失”的邮件中写有美国选举的一些事,看来功夫网已经是“家事国事天下事,事事关心”了。

我选择离开

在A工作了4.3年之后,我选择离开。

简要说说,A是一家在国内专业音频、舞台灯光、电影等方面数一数二的代理+系统集成商,A当年拿下国家大剧院、上海东方艺术中心等巨型项目如探囊取物,确实风光。我就工作在A的北京分公司。

说起辞职的原因,要从2005年10月,公司搬家说起了。新址很宽敞,是由厂房改建而成,层高6米,很不错。不过,新址的缺点就是过于偏远而且交通不便,无论我选择城铁或者公交线路,每天都要花4~5小时在路上,这无疑是在浪费生命。但是,我当时并没有选择离开,而是东拼西凑的借钱买了车,还好,路上的时间缩短到1~2小时/天。

但搬家的影响远非如此简单。非骨干员工换了很多,而招新人很不易,很多人一听说公司地址就放弃面试了。估计也是因此,招人的要求一降再降。我这不是对谁有偏见,背景差异很大的人之间很难有统一的认识。记得当初刚参加工作时,一个耶鲁背景的上司对我说“we are on different frequencies”,当时我可不爱听,不过后来明白了,不是任何人的错,只是频率不同。

频率不同是无法产生共鸣的。同频的人越来越少了,他们更早的选择了离开,而这次轮到我了。也许事情就是这么简单,人以群分。

这次的aaazzz事件是导火索,老板的态度没给我任何余地,也许我要感谢他,在将来的某一天。

附:导火索点燃经过

由于GFW,HK总部很多人收到aaazzz邮件,于是很自然的,他们开始关心发送方(BJ、SHH分公司同事)“是不是中了病毒”。这其实真是冤枉病毒了,病毒邮件怎么会把自己伪装的这么“像病毒”呢?不过对于非专业人士的非专业判断,也不能加以指责,我仔细的收集了问题的症状和“证据”,发给所有人,当然了,我相信只有为数不多的人看了我的邮件。

我发邮件给HK网管,让他们为HK同事做好邮件过滤(其实我以为这是多此一举的,但实际证明,我做的还是不够),以避免重复收到aaazzz邮件,为了避免此邮件也被拦截,我还特意电话确认。没想到第二天,老板一出现就怒了(老板B往返于BJ与HK,有BJ和HK的邮箱,收到aaazzz的是HK邮箱),说,你怎么没有给我解决问题呢?我说,已经告诉HK网管解决方法了。B说,你做了事情,但是你没有给我解决问题。然后B给HK打电话,HK网管告诉他设置一个客户端的邮件过滤,B略有得意的说,看,问题解决了。

我觉得我只好沉默,既然HK网管没及时做的事情要怪罪到我头上,我只好沉默;既然HK网管按我的建议解决了问题我依旧take blame,我只好沉默。另外说明一点,我建议HK网管做的是服务器端邮件过滤,但是他们说ISP不支持,做不了,只好一个一个的同事那做客户端过滤,但不知为何,没有先给老板做。

当然,我并不认为此事我没有一点过错,我只是觉得我不再适合这里了。