确认一个 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

🙂

用一秒钟解数独(Sudoku)

Selection_034

最近要热身一下准备做编程工作了, 想起来以前曾计划写个程序解 Sudoku 但一直拖拉也没做成, 那说做就做吧. 首先我从手机里的 Sudoku 游戏里抄了一道高难度的题目, 写成九行九列的一个方阵. 然后找到已知的数字, 猜测未知的数字. 基本算法是递归. 经过一些优化, 从第一个能解题的版本的 4.6 秒改善到第三版的 1.1秒. 改天再战, 希望能进 1 秒内.

源码我放 GitHub 了, 这里就不重复贴了.

 

免费的正版之路 III

这回咱要说的都是干活用的好东东了,而且同样都是免费使用的:-)

首先是重量级的Aptana WEB IDE,也就是用来写javascript的。随着AJAX应用越来越多,js开发已经不再是copy&paste那么简单了。我其实没用过其它的WEB IDE,所以不好多说了。另外一个好消息,Aptana通过插件的方式把RadRails搬了过来,做ruby on rails也没问题了,而且沾了Aptana的光,Radrails也好用了许多。看图吧:

screenshot_browser_support.png screenshot_problems_view_integrated.png aptana-radrails.png

另一个好东东是用来做HTML的,叫做Nvu(读n-view),也不错,功能也不比Dreamweaver差多少吧?

nvu.gif nvu.png

剩下2个小软件,用于ftp和sftp的WinSCP,以及用于SSH的Putty,就不贴图了,界面简洁,功能够用。

做了一个简单的报表软件

报表选项页和项目清单页:
charting1.png salesmanager03.png

生成报表结果(使用Gruff Graph做的)
my_graph.png

呵呵,rails还是很好玩的。这个软件虽然很简单,但是已经能代替很多Excel功能了,而且可以多人协作。继续努力。