[PHP]解決寄件者名稱與信件標題亂碼問題
最近使用系統的SMTP發信,不過卻遇到了標題亂碼的問題。若是以英文發信,則沒有這部分問題,但若標題內含有中文字,那就會出現奇怪的亂碼問題。相信很多剛使用主機內的SMTP,透過伺服器發信的使用者應該都會有這樣的問題,那該如何解決亂碼問題呢?
這個亂碼問題基本上是發生在信件標題,但是信件內容卻是正常的。上網爬了一下文章,我們只要透過一串語法,改變標題的編碼方式,透過base64編碼的UTF-8文字,就可以解決這個信件標題亂碼問題。
之前有紀錄過該如何使用主機的SMTP發信,當然在那之後我就開始嘗試透過主機發出會員認證信件,不過測試到一半卻遇到標題亂碼的問題,但是信件內容是完全正常顯示的,當然這問題以前就有遇過了,之前有找過一串語法可以處理,所以就去把之前寫過的東西翻出來,順便在Google一下看看到底是什麼原因,複習一下。
簡單說,以上次的寄信程式碼來看,就是在subject部分加上編碼的訊息,程式碼變成如下:$subject="=?UTF-8?B?".base64_encode('主旨')."?=";,我們使用經過base64編碼的UTF-8文字,所以就不會有亂碼問題。那上次那支寄信的程式碼應該會變成以下這樣:
<?php
$to =” [email protected] “; //收件者
$subject=”=?UTF-8?B?”.base64_encode(‘主旨‘).”?=”;//信件標題,解決亂碼問題
$msg = “smtp發信測試“;//信件內容
$headers = “From:[email protected]“; //寄件者
if(mail(“$to”, “$subject”, “$msg”, “$headers”))
echo “信件已經發送成功。“;//寄信成功就會顯示的提示訊息
else
echo “信件發送失敗!“;//寄信失敗顯示的錯誤訊息
?>
如果說寄件者部分有設定名稱,但是又怕遇到亂碼問題,其實可以這樣改看看,目前我是如下這樣處理亂碼的問題,如果有更好的解決方式,歡迎大家提供與補充,謝謝。
<?php
$to =” [email protected] “; //收件者
$subject=”=?UTF-8?B?”.base64_encode(‘主旨‘).”?=”;//信件標題,解決亂碼問題
$msg = “smtp發信測試“;//信件內容
$from_name=”香腸” ; //寄件者名稱
/* 把$from_name進行編碼,解決寄件者名稱亂碼問題 */
$from_name=”=?UTF-8?B?”.base64_encode($from_name).”?=”;
$headers = “From:“.$from_name.” <[email protected]>“; //寄件者名稱和信箱
if(mail(“$to”, “$subject”, “$msg”, “$headers”))
echo “信件已經發送成功。“;//寄信成功就會顯示的提示訊息
else
echo “信件發送失敗!“;//寄信失敗顯示的錯誤訊息
?>
如果有興趣知道更多資訊,可以參考一下官方說明,或是這一篇文章「PHP發送UTF-8編碼中文郵件標題亂碼的解決」,裡面都有更詳細的錯誤解決方式的解釋說明與相關的應用。在寄件者部分遇到編碼問題時,偷偷問了一下小祖,他幫我找了「php處理base64編碼和Unicode客戶端交互的問題」這篇文章,文章內講解了編碼的問題,看了之後有看沒有懂,就當作參考資料在這邊註記一下,以後若用到可以參考。