2016年6月10日 星期五

在E-mail標題使用UTF8字元,解決信件標題亂碼的情形

一般而言,當我們在寄信的時候,如果都採用English或是ASCII範圍的內文字寄送時,收到信件的人皆可正確地閱讀信件內容及標題。但是隨著國際化的普及,ASCII的編碼已經不能應付各國多文字的需求,於是漸漸改採用UTF-8編碼格式。

然而,寄送信件的服務,似乎沒有跟上這樣的改變,嚴格來說,各國SMTP服務預設都會採用各國的編碼,所以一旦輸入了中文的難字或特殊字、或是寄信給其他國家時,亂碼的情形就會發生。

好在,我們可以指定信件內文(body)的編碼格式,這必須輸入在信件的表頭(eamil header)中,指定的格式類似像:
Content-Type: text/plain; charset=utf-8

可是,這樣的設定並不更改標題的編碼,因為標題的編碼是獨立的,且其編碼預設為ASCII碼。好在,RFC 1342亦提供了更改的方法,只要遵照其格式以可以修正其編碼,其格式像是:
=?charset?encoding?encoded-text?=

說真的,這樣的格式還滿奇怪的,左右兩個"=",然後藉由"?"把要設定的參數隔開,倘若把這樣的東東再加到PHP程式中,鐵定有看沒有懂。
第1個參數:charset,就是要採用的編碼,當然若要字元能正常顯示,就要採用UTF-8萬國碼
第2個參數:encoding,通常我們會輸入B或Q,這樣的意義是讓信件再用Base64編碼過後傳遞,至於為何/什麼是Base64編碼,簡言之,就是將信件內容不管是文字、影像、影音、其他附加檔案等等....都經過編碼後再傳遞,收到的人自動在解碼還原。聽不懂嗎?那再換句話說就是:「採用Base64編碼技術的話,信件才能寄送文字以外的檔案格式。」
第3個參數:就是要編碼的標題文字為何?但既然第2個參數已經採用Base64編碼,那我們當然也要把輸入的中文利用php函式編碼轉換。

所以我們的寫法會像是:
=?UTF-8?B?".base64_encode('主旨')."?=

針對上面的說明,我們可以簡單的設計一個寄送信件的PHP程式

<?php
$to = " recipient@example.com “; //收件者
$subject = "=?UTF-8?B?".base64_encode(‘信件標題‘)."?=";    //信件標題,解決亂碼問題
$msg = “信件內容“; //信件內容
$header = "'From: example@example.com'."\r\n"
.'Content-Type: text/plain; charset=utf-8'."\r\n";
if(mail($to, $subject, $msg, $header)){
echo “信件已經發送成功。“;//寄信成功就會顯示的提示訊息
}else{
echo “信件發送失敗!“;//寄信失敗顯示的錯誤訊息
}
?>


參考網頁:

沒有留言:

張貼留言