PHP mail() and charset encoding question

石頭閒語:PHP mail() and charset encoding question – 樂多日誌

不知從何時開始, PHP 內建的 mail() 行為改變了,使用 mail() 寄發電子郵件時,似乎會固定將內文之字元編碼轉為 iso-8859-1 字元集。於是用 mail() 寄中文郵件時變亂碼、寄東歐文字郵件時變亂碼、寄日文郵件時變亂碼等等問題一一出現。如何寄非英文語系郵件幾乎成了 FAQ 級問題。

早期的 mail() 並沒有這種狀況。基本上只要在信件的標頭欄位中添加文件型態及字元集(charset)資訊,如 ‘Content-type: text/plain; charset="big5″‘ 即可用以寄發中文郵件。但不知何時開始,這種方式不再適用。在 PHP manual 中也未提到這方面的變化,僅僅說可用 PEAR::Mail 完成更複雜郵件寄送工作。另外隱晦地加上 mb_send_mail() ,表示應該使用此一函數寄發多位元組字元集文字郵件。

為了測試前述問題所在,以及完成寄送中文郵件的工作,我設計了一個替用的 mail 函數。對於了解 SMTP 協定內容的程序員而言,要自行設計一個 mail() 並不困難。下列便是我設計的 mail() 替用函數。它是一個對照組,用以測試並確認郵件內容變亂碼是 PHP 內建的 mail() 所造成的。由於設計目的之中包含了測試用途,所以程式碼中還留有觀察訊息的敘述。

Phpmailer 在Windows平台及Linux平台上的差異

Cloudolphin’s place: Phpmailer 在Windows平台及Linux平台上的差異

Phpmailer 在Windows平台及Linux平台上的差異
由於之前測試送信郵件是在windows平台上使用 , 但是轉到Linux平台上後發現一些小問題

getFile 路徑錯誤
由於php對於路徑的定義大多以 ‘ 夾帶 , 例如 : ‘ xxxxx/xxx.xx ‘ , 但是有些時候 " 在windows平台上是可用的 , 因此建議將有關路徑的字串都改用 ‘ 夾帶 .
( 包含製作Html Mail 版面引入getFile方法 , require方法等等 )

template 版面的圖出不來 (Html Mail 的版面 )
由於我將版面額外設定在一個檔案 ( Template.html ) , 裡面引用的圖片就當做普通網頁那樣的設定 , 但是轉換到Linux平台上 , 圖都沒有跟著以附件方式夾帶過來!! 所以建議在引用圖片的時候 , 還是以官方夾帶檔案的方式處理 , 這在兩種平台上都保證沒問題!

下面範例是改編自官方網站 , 將重點標示一下

$mail->AddEmbeddedImage(“XX.jpg", “引入圖片的名稱(可以自訂)", “XX.jpg");
$mail->Body = ‘AAA‘;

參考網址 :
http://phpmailer.codeworxtech.com/tutorial.html#3
http://phpmailer.codeworxtech.com/methods.html

ps. 如果有使用 Crontab方式排程 , 記得將Javascript的部分修改一下 , 因為下語法使用PHP去執行網頁 (把php網頁當作script一樣的執行 ) , 並不會去理會Javascript! 別跟我一樣傻傻跟使用瀏覽器一樣在那邊等它動作^^"~

WordPress mysql db 由 latin1 轉成 utf8

阿亮遇見熊 » WordPress mysql db 由 latin1 轉成 utf8

原本我這個 wordpress 的 mysql 資料庫 (比如名稱為 myblog),DB_COLLATE 為 latin1_swedish_ci ,也不是不能用,只是用 phpmyadmin 會變亂碼,在後台處理會麻煩點。

為了後端資料庫方便直接修改資料內容,就花點時間將該資料庫轉成 utf8 的資料。

參考各方資料,最後實作的步驟如下:

新增一個新的 db,比如為 myblog_utf8,用 phpmyadmin 將其 DB_COLLATE 設成 utf8_general_ci 或 utf8_unicode_ci

將 myblog 的資料匯出

mysqldump myblog –default-character-set=latin1 > test.sql

用 vi 編輯 test.sql,執行取代字串

:% s/CHARSET=latin1/CHARSET=utf8/g

然後,將 test.sql 的下列這行

/*!40101 SET NAMES latin1 */;

取代成

/*!40101 SET NAMES utf8 */;

然後,將 test.sql 匯入 myblog_utf8

mysql myblog_utf8 –default-character-set=utf8 < test.sql

編輯 wp-config.php 的 DB_NAME, DB_CHARSET 及 DB_COLLATE,讓原來的 db 重新指到 myblog_utf8 即完成。

define(‘DB_NAME’, ‘myblog_utf8’);
define(‘DB_CHARSET’, ‘utf8’);
define(‘DB_COLLATE’, ‘utf8_general_ci’);

PS: 並不需要用 iconv 等編碼轉換的過程!