phpmailer叫板163的vip用户

      phpmailer是用php做的一个邮件发送的组件,而163是专业做邮件的大的运营商,这两者之间有什么瓜葛呢?且听我细细道来.
      笔者基于phpmailer做了个发邮件的小程序,但是给类似"[email protected]"这样的邮件地址发邮件的时候总会收到这样的错误:"You must provide at least one recipient email address.".开始以为是邮件服务器有问题,结果去服务器看日志,竟然没有相关的信息,也就是说肯定是程序的问题.网上找了半天也没有找到什么有价值的信息,倒是有位同学说也遇到同样的问题,不过自己解决了.解决办法是自己看的代码,也没提供怎么解决的,郁闷.看来要自己动手了.
      虽然用php快一年了,但是对于phpmailer的这样很规范的代码我还没敢研究过.既然有同学通过读代码解决问题了,我也试试呗,谁让咱也以phper自居呢.通过关键字搜索,很快就将问题定位到了class.phpmailer.php的523行.
 523   public static function ValidateAddress($address) {
 524     if (function_exists('filter_var')) { //Introduced in PHP 5.2
 525       if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
 526         return false;
 527       } else {
 528         return true;
 529       }
 530     } else {
 531       return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-       Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,        2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
 532     }
 533   }
      从字面上就可以看出这段是用来验证邮件地址有效性的.php先判断是不是有内置函数filter_var,如果没有的话就用perl正则验证邮件.网上找了一下,发现php在5.2以后提供了filter_var用来验证邮件地址有效性.于是手工用filter_var验证了一下"[email protected]",果然不通过!问题找到了,怎么解决呢?最简单的,可以直接把if这一段直接删除,所有的邮件地址都走perl正则验证,但是考虑到perl正则的效率,决定不用这个办法.既然filter_var检查vip.163.com的邮件会失败,那就在失败的时候加个判断吧.于是把526行,替换成如下内容.
 526           if(strpos(strtolower($address),'@vip')){
 527               return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:     [a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?       \d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
 528           }
 529           else{
 530             return false;
 531           }
      为什么要这么改呢?解释一下:strtolower是将邮件地址里的字母全部小写,虽然邮件系统不区别大小写,但是经常大写邮件地址估计是只有中国人才会干的事儿吧;用strpos是因为这个函数字符串查找效率很高;关键是为什么要查找'@vip'呢?因为不止163一家提供邮件的vip服务,估计这也是中国特色吧.改完以后看起来是这样的:
 523   public static function ValidateAddress($address) {
 524     if (function_exists('filter_var')) { //Introduced in PHP 5.2
 525       if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {
 526           if(strpos(strtolower($address),'@vip.')){
 527               return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:     [a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?       \d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
 528                }
 529           else{
 530             return false;
 531             }
 532       } else {
 533         return true;
 534       }
 535     } else {
 536       return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-       Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,        2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
 537     }
 538   }
      就这样很痛快的解决了phpmailer和163的vip用户之间的恩怨(当然了也可以说是php的filter_var函数和163的vip邮件之间的恩怨).很有点小成就感呢.最近这段时间精神状态很好,工作中遇到的问题总能迅速理清思路,迎刃而解.颇有"神挡杀神,佛挡杀佛"感觉.就让我继续这样开心,努力的工作,就让暴风雨来得更猛烈些吧:)

你可能感兴趣的:(职场,email,one,phpmailer,at,休闲,LEAST,provide,must,"You,address.",vip.163.com,recipient)