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