[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客戶端交互的問題」這篇文章,文章內講解了編碼的問題,看了之後有看沒有懂,就當作參考資料在這邊註記一下,以後若用到可以參考。