phpmailer叫板163的vip用户
时间:2010-09-15 来源:rainbird2
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邮件之间的恩怨).很有点小成就感呢.最近这段时间精神状态很好,工作中遇到的问题总能迅速理清思路,迎刃而解.颇有"神挡杀神,佛挡杀佛"感觉.就让我继续这样开心,努力的工作,就让暴风雨来得更猛烈些吧:)