《PHP學(xué)習(xí):php的mail函數(shù)發(fā)送UTF-8編碼中文郵件時(shí)標(biāo)題亂碼的解決辦法》要點(diǎn):
本文介紹了PHP學(xué)習(xí):php的mail函數(shù)發(fā)送UTF-8編碼中文郵件時(shí)標(biāo)題亂碼的解決辦法,希望對您有用。如果有疑問,可以聯(lián)系我們。
最近遇到一個(gè)問題,就是在使用php的mail函數(shù)發(fā)送utf-8編碼的中文郵件時(shí)標(biāo)題出現(xiàn)亂碼現(xiàn)象,而郵件正文卻是正確的.最初以為是頁面編碼的問題,發(fā)現(xiàn)頁面編碼utf-8沒有問題啊,找了半天原因,最后找到了問題所在.PHP編程
?PHP編程
1.使用 PEAR 的 Mail 類PHP編程
PEAR 的 Mail 類可以讓你選擇使用 sendmail 或者 SMTP 方式發(fā)信,這樣的包裝好的接口很好用,你沒有必要去自己重新發(fā)明輪子.
PHP編程
2.關(guān)于headers 中subject 的亂碼PHP編程
不要把任何除了 iso-8859-1 編碼之外的文字直接放進(jìn)subject,正確的方式是讓subject 里頭的文字符合RFC 2047 的規(guī)范,假設(shè)你的subject 處的文字的編碼是GB2312,那么正確的subject應(yīng)該是這樣的格式
$headers['subject'] = '=?GB2312?B?' . base64_encode('標(biāo)題文字') . '?=';
如果是UTF-8 的話,把上面開頭的GB2312 替換成UTF-8 即可.推薦在標(biāo)題處使用GB2312 編碼,因?yàn)镸TA 的分化實(shí)在是嚴(yán)重,大部分的MSP使用的都是自己開發(fā)的 MTA,而相信國內(nèi)的大部分 MTA 無論如何都是可以支持 GB2312 編碼的.PHP編程
而如果是發(fā)送到國外的MSP,則推薦你在subject 處使用經(jīng)過base64 編碼的 UTF-8 文字,因?yàn)樗麄兒芸赡懿恢С?GB2312 編碼.
PHP編程
3.一定在headers 中添加content-typePHP編程
電子郵件的 headers 中的 content-type 處類似網(wǎng)頁的,也是 text/plain; charset=gb2312 這樣的格式.這個(gè)選項(xiàng)主要對收郵件的客戶端有意義,可以避免在客戶端出現(xiàn)亂碼,部分的 Webmail 也會根據(jù)這里的設(shè)置對郵件的內(nèi)容進(jìn)行編碼轉(zhuǎn)換以正確顯示.你可以設(shè)想一下你用 gb2312 編碼發(fā)到 .com.tw 的郵箱時(shí)候的情況.
PHP編程
4.對你用來發(fā)送郵件的主機(jī)進(jìn)行正確配置
PHP編程
1)一定配置反向解析,因?yàn)榇蟛糠值姆枪潭?IP 都無法做反向解析,部分反垃圾郵件策略以此作為判斷依據(jù).
2)一定配置 MX 解析,道理同上.
3)確保你的 return path 是能夠收到退信的,否則你的郵件發(fā)送服務(wù)器可能會進(jìn)入接收端的黑名單.PHP編程
$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);
先用函數(shù)base64_encode() ― 使用MIME base64 對數(shù)據(jù)進(jìn)行編碼
標(biāo)題字符串前加編碼類型例如: =?UTF-8?B?
標(biāo)題字符串后加:?=
例如:PHP編程
<?php $to = "clairelume@qq.com"; //將此電子郵件地址改為自己的. $name = $_POST['name']; $email = $_POST['email']; $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['message']; mail($to,$subject,$message,"From: ".$email."",$headers); echo 'OK '.$name.', 您的郵件已發(fā)送.'; ?>
這樣,發(fā)送的中文郵件標(biāo)題就不是亂碼了.
PHP編程
PHP編程
是不是很簡單,其實(shí)把問題分析透了,所有的問題都會迎刃而解了,希望這篇文章對大家的學(xué)習(xí)有所贊助.PHP編程
歡迎參與《PHP學(xué)習(xí):php的mail函數(shù)發(fā)送UTF-8編碼中文郵件時(shí)標(biāo)題亂碼的解決辦法》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/8563.html