php mail 163,phpmailer叫板163的vip用户

phpmailer是用php做的一个邮件发送的组件,而163是专业做邮件的大的运营商,这两者之间有什么瓜葛呢?且听我细细道来.

笔者基于phpmailer做了个发邮件的小程序,但是给类似"test@vip.163.com"这样的邮件地址发邮件的时候总会收到这样的错误:"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验证了一下"test@vip.163.com",果然不通过!问题找到了,怎么解决呢?最简单的,可以直接把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邮件之间的恩怨).很有点小成就感呢.最近这段时间精神状态很好,工作中遇到的问题总能迅速理清思路,迎刃而解.颇有"神挡杀神,佛挡杀佛"感觉.就让我继续这样开心,努力的工作,就让暴风雨来得更猛烈些吧:)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部