介紹如何在 PHP 中使用 UTF-8 編碼讓 Email 信件標題可以包含中文字,不需要 SMTPUTF8
支援。
UTF-8 Email 內容
如果要寄送含有 UTF-8 編碼的 Email,可以在郵件標頭中指定內容類型(Content-Type),例如 UTF-8 編碼的文字郵件就指定為:
Content-Type: text/plain; charset="UTF-8"
若為 UTF-8 編碼的 HTML 郵件則指定為:
Content-Type: text/html; charset="UTF-8"
這個 Content-Type
所指定的編碼僅適用於郵件內容(body),而郵件的標題(title)本身是一種郵件標頭(header),並不包含於郵件內容之中,因此就算在這樣宣告為 UTF-8 編碼的郵件之中,郵件標題還是只能包含 ASCII 字元。
UTF-8 Email 標題
RFC 1342 提供了一種編碼方式,可讓 UTF-8 編碼的文字經過編碼之後,放入郵件標題,其格式為:
=?charset?encoding?encoded-text?=
其中 charset
就是文字的原始編碼(例如 UTF-8),而 encoding
可以是 B
(代表 Base64)或 Q
(代表 Quoted-printable),而 encoded-text
就是編碼後的資料。
如果將 UTF-8 編碼的 中文
兩個字以 RFC 1342 的方式配合 Base64 編碼,結果就會像這樣:
=?UTF-8?B?5Lit5paH?=
PHP 寄送 UTF-8 郵件
若要在 PHP 中寄送 UTF-8 編碼的郵件,可以在郵件標頭指定 Content-Type
為 UTF-8,並使用 base64_encode
函數處理標題文字的編碼,以下是一個簡單的範例:
<?php # 收件者 $to = 'example@example.com'; # 郵件標題 $subject = '中文標題'; # 郵件內容 $message = '中文內容'; # 郵件標頭 $headers = 'From: example@example.com' . "\r\n" . 'Content-Type: text/plain; charset="UTF-8"' . "\r\n"; # 寄送 UTF-8 編碼的郵件 mail($to, '=?UTF-8?B?' . base64_encode($subject) . '?=', $message, $headers) ?>
參考資料:ncona.com