最近在利用phpmailer这个很火的第三方函数包开发php邮件发送功能时候,遇到一个很蹊跷的乱码问题,即发出去的邮件有时候邮件标题会变成一堆很特别的乱码,乱码的具体内容根据邮件标题是会发生变化的,不过共同的特点是都是有=?utf-8?B?这样的格式,在网上查阅了很多资料,包括stackoverflow,有不少人也都遇到过这个问题,但是回答的都比较模糊,初步的结论是邮件标题在进行base64编码时可能由于中文、特殊字符等原因产生了乱码,但单纯这么说毕竟不能令人信服,只能选择自己动手,查看phpmailer的源码来查找这个问题
经过反复var_dump和exit进行断点,最终目标确定在了这样一段代码上
public function EncodeHeader($str, $position = 'text') {
$x = 0;
switch (strtolower($position)) {
case 'phrase':
if (!preg_match('/[\200-\377]/', $str)) {
// Can't use addslashes as we don't know what value has magic_quotes_sybase
$encoded = addcslashes($str, "\0..\37\177\\\"");
if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
return ($encoded);
} else {
return ("\"$encoded\"");
}
}
$x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
break;
case 'comment':
$x = preg_match_all('/[()"]/', $str, $matches);
// Fall-through
case 'text':
default:
$x += preg_match_all('/[\0