Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5008922
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2008-04-09 11:01:29

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));



阅读(1974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~