博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让phpmailer支持中文名称的附件和邮件标题中文乱码(转)
阅读量:6949 次
发布时间:2019-06-27

本文共 1969 字,大约阅读时间需要 6 分钟。

  hot3.png

<?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($pathstrrpos($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)); 
?> 

转载于:https://my.oschina.net/wyx/blog/60855

你可能感兴趣的文章
保持新投资技术先进性和保护既有投资的完美均衡 —— 成都地铁4号线二期PIS车地无线通信...
查看>>
《Android和PHP开发最佳实践》一第3章 PHP开发准备
查看>>
黑客的克星或叫“白客”
查看>>
假如在1996年,微软、IBM、苹果你会投资谁?
查看>>
国网四川电力应用大数据服务经济社会发展
查看>>
杭州云栖大会10月起航,这里有一份最全的大会剧透
查看>>
雅虎卖身不影响梅耶尔赚钱 她总薪酬2.2亿美元
查看>>
Win10周年升级新增52000个emoji表情
查看>>
大数据降噪方法论
查看>>
衰退的爱立信,进击的华为
查看>>
索尼工厂被迫停止生产,日本地震带来的冲击可能不止于此
查看>>
独角兽复活:Twilio上市预示IPO市场起死回生
查看>>
数据中心运维管理经验39条
查看>>
安防的未来五年 如何把握机遇深耕市场?
查看>>
如此逼真的高清图像居然是端到端网络生成的?GANs 自叹不如 | ICCV 2017
查看>>
Wework的线上社交,能否支撑其169亿估值?
查看>>
印度SaaS创企Whatfix获370万美元A轮融资
查看>>
征信考量社交化和大数据化
查看>>
虚拟仪器技术的飞跃是测试行业转折点
查看>>
SD-WAN+物联网:让城市更智慧
查看>>