[PHP]解決 PEAR::Mail_Mime 標題 UTF-8 亂碼問題(不能顯示)
Oct 1st, 2008 by appleboy 參觀者:10,709Views 機器人:1,725Views
話說大家在寫 PHP 的時候,一定會很常用到 mail 這個函式,畢竟一個網站一定會有很多需要用到寄信的地方,我先給大家推薦一下 PEAR::Mail_Mime 跟 PEAR::Mail 這兩個 Pear 的套件,用起來相當不錯,支援 html 跟 UTF-8 或者是 Big5 編碼,我之前寫過一篇 [PHP] 好用的 PEAR – PHP Mail and Mail_Mime,裡面寫的還蠻詳細的,不過上次有一個問題還沒解決,就是如果用 UTF-8 編碼的標題,會顯示不出來,Gmail 收到的話就會是 no subject,然後昨天用了一個非常笨的解決方法,改成把標題使用 Big5 就可以了,解決方法如下:
Update:感謝 darkhero 提供解決方法:
如果要用 UTF-8 的標題:
$hdrs = array(
'From' => 'appleboy.tw@gmail.com',
'Subject' => '=?utf8?B?' . base64_encode($subj) . '?=',
'Content-type' => 'text/html; charset=utf-8'
);
先讓主機支援 PEAR:
# FreeBSD ports 安裝
cd /usr/ports/devel/pear
make install clean
然後當然是自己寫一個 send mail 函式來使用,這樣以後就呼叫這個 function 就可以了
{
global $db,$userdata, $board_config;
include(Document_root . '/includes/Mail.php');
include(Document_root . '/includes/Mail/mime.php');
$html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>'.$subj.'</title>
</head>
<body>
'.$body.'
</body>
</html>';
//$file = '/home/appleboy/adwii/AB2.jpg';
$crlf = "\n";
//$param['text_charset'] = 'utf-8';
$param['html_charset'] = 'utf-8';
$param['head_charset'] = 'Big5';
$hdrs = array(
'From' => 'appleboy.tw@gmail.com',
'Subject' => iconv("UTF-8","BIG5",$subj),
'Content-type' => 'text/html; charset=utf-8'
);
$mime = new Mail_mime($crlf);
$mime->setTXTBody($text);
$mime->setHTMLBody($html);
//$mime->addAttachment($file, 'text/plain', 'AB2.jpg');
$body = $mime->get($param);
$hdrs = $mime->headers($hdrs);
//echo $body;
$mail =& Mail::factory('mail');
$mail->send($board_config['board_email'] . ', ' . $to, $hdrs, $body);
}
這是我之前寫的函式,裡面標題本來不能用的,我系統跟程式都是使用 UTF-8,標題也是都利用 UTF-8 設定,可是標題顯示步來,那就改用 Big5 吧,所以是設定如下
先把 $param['head_charset'] = ‘UTF-8′; 裡面設定改成 Big5 這樣就可以了,然後在 Subject 轉成 Big5 利用 PHP iconv 函式就可以了,然後在隨便測試一下就可以 work 了

可以在 gmail 上看一下信件原始碼,看 subject 的部份有沒有做好的部份有沒有做base64 encode
有 encode 應該會變成類似 =?big5?B?R0M3LbC2qb6paqlqqrqysqf4teayxKRHs/Wz+KZXplez5g==?=
或是
=?utf8?B?R0M3LbC2qb6paqlqqrqysqf4teayxKRHs/Wz+KZXplez5g==?=
若是沒有.就只好自己編碼一下 subject 然後塞進去…
阿凱兄:
感謝喔,測試一下,大概加上下面語法就ok了
text/plain => text/html 才可以看到 html
hi fiddle:
感謝告知,已修正