首頁  >  文章  >  後端開發  >  php的mail函數發送UTF-8編碼中文郵件時標題亂碼怎麼辦?

php的mail函數發送UTF-8編碼中文郵件時標題亂碼怎麼辦?

coldplay.xixi
coldplay.xixi原創
2020-07-27 09:16:072233瀏覽

php的mail函數發送UTF-8編碼中文郵件時標題亂碼的解決方法:1、將subject裡頭的文字符合RFC 2047的規範;2、在headers中加入【content-type】;3 、對用來發送郵件的主機進行正確配置。

php的mail函數發送UTF-8編碼中文郵件時標題亂碼怎麼辦?

php的mail函數傳送UTF-8編碼中文郵件時標題亂碼的解決方法:

1.使用PEAR 的Mail 類別

PEAR 的Mail 類別可以讓你選擇使用sendmail 或SMTP 方式發信,這樣的包裝好的介面很好用,你沒有必要去自己重新發明輪子。

2.關於headers 中subject 的亂碼

#不要把任何除了iso-8859-1編碼之外的文字直接放進subject ,正確的方式是讓subject 裡頭的文字符合RFC 2047的規範,假設你的subject 處的文字的編碼是GB2312,那麼正確的subject 應該是這樣的格式

$headers['subject'] = '=?GB2312?B?' . base64_encode('标题文字') . '?=';

如果是UTF-8 的話,把上面開頭的GB2312 換成UTF-8 即可。建議在標題處使用GB2312 編碼,因為MTA 的分化實在是嚴重,大部分的MSP使用的都是自己開發的 MTA,而相信國內的大部分 MTA 無論如何都是可以支援 GB2312 編碼的。

而如果是發送到國外的MSP,則推薦你在subject 處使用經過base64 編碼的 UTF-8 文字,因為他們很可能不支援 GB2312 編碼。

3.一定在headers 中加入content-type

電子郵件的headers 中的content-type 處類似網頁的,也是text/plain; charset=gb2312 這樣的格式。這個選項主要對收郵件的用戶端有意義,可以避免在客戶端出現亂碼,部分的 Webmail 也會根據這裡的設定對郵件的內容進行編碼轉換以正確顯示。你可以設想一下你用 gb2312 編碼發到 .com.tw 的郵箱時候的情況。

4.對你用來傳送郵件的主機進行正確設定

#1)一定設定反向解析,因為大部分的非固定IP 都無法做反向解析,部分反垃圾郵件策略以此作為判斷依據。

2)一定配置 MX 解析,道理同上。

3)確保你的 return path 是能夠收到退信的,否則你的郵件發送伺服器可能會進入接收端的黑名單。

$subject = stripslashes($the_post['Title']); 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/plain; charset=utf-8\r\n"; 
$headers .= "Content-Transfer-Encoding: 8bit\r\n"; 
$message = stripslashes(strip_tags($the_post['Content'])); 
mail($to, $subject, $message, $headers);

先用函數base64_encode()— 使用MIME base64 對資料進行編碼

標題字串前加編碼類型例如:=?UTF-8 ?B?

標題字串後加:?=

例如:

<?php  
 $to = "clairelume@qq.com"; //将此电子邮件地址改为自己的。  
 $name = $_POST[&#39;name&#39;];  
 $email = $_POST[&#39;email&#39;];  
 $subject = "来自博客读者的邮件";  
 $subject = "=?UTF-8?B?".base64_encode($subject)."?=";  
 $headers = "MIME-Version: 1.0\r\n";  
 $headers .= "Content-type: text/plain; charset=utf-8\r\n";  
 $headers .= "Content-Transfer-Encoding: 8bit\r\n";  
 $message = $_POST[&#39;message&#39;];  
 mail($to,$subject,$message,"From: ".$email."",$headers);  
 echo &#39;OK &#39;.$name.&#39;, 您的邮件已发送。&#39;;  
?>

這樣,發送的中文郵件標題就不是亂碼了。

相關學習推薦:PHP程式設計從入門到精通

#

以上是php的mail函數發送UTF-8編碼中文郵件時標題亂碼怎麼辦?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn