<?php
phpmailer设置使用utf-8编码发送邮件之后,已经可以正常的发送中文邮件了,固然你调用时传进去的中文参数必须也是utf-8编码才行,可是我发现,即便这样,发送中文文件名的附件的时候,附件名称不能正确的显示。
好比咱们要发送的附件是“测试.txt”,若是在添加附件的时候强制使用指定文件名的方式:
$mail->AddAttachment($attach, $attach);
那么发送过去的附件文件名将会是乱码,若是不指定:
$mail->AddAttachment($attach, $attach);
那么发送过去的文件名中的中文干脆没了,成了“.txt”。
究其缘由,打开class.phpmailer.php,在大概第1007行左右,函数AddAttachment中,有一句
$filename = basename($path);
缘由就在这里,如今咱们使用的php 5.1.2,包括他之前的不少版本,basename函数和dirname函数都是不支持中文文件名的,因此一解析就把中文给过滤掉了。而若是强行指定文件名为何还乱码呢,这是由于phpmailer虽然会自动根据你设定的编码方式给主题、正文进行utf-8编码化,可是却不会给附件的文件名编码。如今,只须要修改上面这一句,就可以同时解决这两方面的问题了。修改结果以下:
//$filename = basename($path);
if (false === strpos($path, ‘/’))
$filename = $this->EncodeHeader($path);
else
$filename = $this->EncodeHeader(substr($path, strrpos($path, ‘/’) + 1));
不使用basename函数了,改用本身的方法来获得文件名,而且借用了主题Subject的编码函数EncodeHeader来生成utf-8编码形式的附件名称,搞定。
解决中文标题乱码:
下面是一个基于 PHPMailer 的发送函数,旧代码了:
function smtp_main_send( $to, $subject, $message, $from, $fromName ) {
$mail = new PHPMailer();
$mail->CharSet = "UTF-8"; // 设置编码
$mail->IsSMTP(); // 设置使用SMTP服务发送
$mail->Host = "smtp.mail.com";
$mail->Username = "user";
$mail->Password = "pass";
$mail->SMTPAuth = true;
$mail->From = $from;
$mail->FromName = $fromName;
if ( is_array( $to ) ) {
foreach ( $to as $address ) {
$mail->AddAddress( $address );
}
} else {
$mail->AddAddress( $to );
}
$mail->Subject = $subject;
$mail->Body = $message;
$mail->AltBody = $message;
$mail->IsHTML( true );
return $mail->Send();
}
直接这样发送邮件,英文没有问题,但在发送中文的时候标题会有乱码。须要对 class.phpmailer.php 作一些修改:
修改1,1137 行:
function EncodeHeader ($str, $position = 'text') {
将函数增长一个参数:
function EncodeHeader ($str, $position = 'text', $pl = 0) {
if ( $pl ) return "=?" . $this->CharSet . "?B?" . base64_encode($str) . "?=";
修改2,796 行:
$result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject)));
将调用改成:
$result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject),'text', 1));
?> php