[PHP]解決 PEAR::Mail_Mime 標題 UTF-8 亂碼問題(不能顯示)

話說大家在寫 PHP 的時候,一定會很常用到 mail 這個函式,畢竟一個網站一定會有很多需要用到寄信的地方,我先給大家推薦一下 PEAR::Mail_MimePEAR::Mail 這兩個 Pear 的套件,用起來相當不錯,支援 html 跟 UTF-8 或者是 Big5 編碼,我之前寫過一篇 [PHP] 好用的 PEAR – PHP Mail and Mail_Mime,裡面寫的還蠻詳細的,不過上次有一個問題還沒解決,就是如果用 UTF-8 編碼的標題,會顯示不出來,Gmail 收到的話就會是 no subject,然後昨天用了一個非常笨的解決方法,改成把標題使用 Big5 就可以了,解決方法如下: Update:感謝 darkhero 提供解決方法: 如果要用 UTF-8 的標題:
  $param['head_charset'] = '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 就可以了
function send_mail($to, $subj, $body)
{
  global $db,$userdata, $board_config;
  include(Document_root . '/includes/Mail.php');
  include(Document_root . '/includes/Mail/mime.php');
  $html = '
          
          
          
            '.$subj.'
          
          
          '.$body.'
          
          ';
  //$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'] = 'Big5';
  $hdrs = array(
                'From'    => 'appleboy.tw@gmail.com',
                'Subject' => iconv("UTF-8","BIG5",$subj), 
                'Content-type' => 'text/html; charset=utf-8'
                );
先把 $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了

    [cc lang=”php”]
    ‘=?utf8?B?’ . base64_encode($subj) . ‘?=’
    [/cc]

  • fiddle

    text/plain => text/html 才可以看到 html

  • hi fiddle:
    感謝告知,已修正