讓phpmailer支持中文名稱的附件和郵件標題中文亂碼(轉)

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

相關文章
相關標籤/搜索