PHP mail function 如何避免亂碼?

Posted by – June 16, 2011

又是一個工作上碰到的問題,需要寫一個簡單的 email 發送功能。雖然是基本功能,不過常見的作法還是藉由 PHPMailer Library 來達成。不過這個案子因為寄信頻率很低,想說用 PHP 內建的 mail() 就可以處理了。但是人算不如天算,怎知 mail() 成功了,但是卻是一堆亂碼,標題、寄件人欄位都是亂碼..... 囧

經過一番 Google Search 的奮戰,找到一個很 tricky 的解決方法。將會出現亂碼的文字用以下方式處理....

"=?UTF-8?B?".base64_encode(" 會出現亂碼的文字 ")."?="

這樣用 GMAIL 收到信的時候就可以看到正常的文字了。

mail function 範例如下...

function sendMail($recipient){
    $subject = "=?UTF-8?B?".base64_encode("信件標題")."?=";
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=UTF-8\r\n";
    $headers .= "From: "."=?UTF-8?B?".base64_encode("寄件人 ")."?=";
    $headers .= "<sender@email.com>";
    $message  = '<p><font size="3" face="新細明體">信件內文</font></p> ';

    return mail($recipient, $subject, $message, $headers);
}

順便補充一下,為了送出 html 格式的郵件,必須在 header 中指定 Content-type: text/html 才行。

PHP 有 mb_encode_mimeheader 來為雙位元文字編碼,不過以此方式編碼的信件在 Gmail 中仍顯示亂碼,所以只好用比較 tricky 的方法來處理了。

References:

Leave a Reply

Your email address will not be published. Required fields are marked *