酷!學園

技術討論區 => 程式討論版 => PHP程式設計討論區 => 主題作者是: appleboy 於 2008-10-01 16:28

主題: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: appleboy2008-10-01 16:28
已經在 ptt 的 PHP 提供了這個資訊,我覺得還不錯,畢竟看到大家都有這個問題

mail 這個函式在官網提供很多範例,其實都還不錯,不過個人很推 PEAR - PHP Mail and Mail_Mime

可以參考

[PHP] 好用的 PEAR - PHP Mail and Mail_Mime

http://blog.wu-boy.com/2007/12/18/129/

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

http://blog.wu-boy.com/2008/10/01/524/

接下來就是介紹怎麼安裝了,首先你的系統要有搭配 php pear 的套件

代碼: [選擇]
cd /usr/ports/devel/pear
make install
不過你如果裝 php5 的套件的話,她會順便一起裝進去,我想這不是重點

再來就是下載 PEAR::Mail 跟 PEAR::Mail_Mime 套件

其實作法很簡單,就是下載程式都丟到 includes 裡面,然後要用到的時候,利用底下

代碼: [選擇]
define('Document_root',dirname(__FILE__));
這個相當好用,取得絕對路徑,之後只要寫成下面底下就好

代碼: [選擇]
include(Document_root . '/includes/Mail.php');
include(Document_root . '/includes/Mail/mime.php');

再來是最普通的寄送範例:

代碼: [選擇]
  include(Document_root . '/includes/Mail.php');
  $recipients = 'joe@example.com';
  $headers['From']    = 'richard@phpguru.org';
  $headers['To']      = 'joe@example.com';
  $headers['Subject'] = 'Test message';
  $body = 'Test message';
  $mail_object =& Mail::factory('mail');
  $mail_object->send($recipients, $headers, $body);


裡面有一行
$mail_object =& Mail::factory('mail');
這個有三種方式 mail, sendmail, smtp

mail: 這是不需要任何參數的
sendmail:需要 sendmail 的程式路徑跟她所需要的參數
smtp:需要 mail 主機位址,port,是否需要認證,帳號密碼之類的

當然我們用最普通的就好,那就是 mail 就可以,不過前提你要先架好 mail Server

Mail_Mime 的部分:

這部份比較複雜,我們先看範例:

代碼: [選擇]
  include(Document_root . '/includes/Mail.php');
  include(Document_root . '/includes/Mail/mime.php');
  $text = '我是小惡魔我是小惡魔我是小惡魔我是小惡魔';
  $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>Hello World!</title>
  </head>
  <body>
  <p>Hello World!</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  <p>我是小惡魔</p>
  </body>
  </html>';
  $file = '/home/appleboy/adwii/AB2.jpg';
  $crlf = "\n";
  $param['text_charset'] = 'utf-8';
  $param['html_charset'] = 'utf-8';
  $param['head_charset'] = 'utf-8';
  $hdrs = array(
                'From'    => 'appleboy@example.org',
                'Subject' => '系統資訊',
                'Content-type' => 'text/plain; 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('appleboy@example.org', $hdrs, $body);


這個範例,可以附加檔案,跟寫 html 格式的 mail 寄信到對方
$mime->addAttachment($file, 'text/plain', 'AB2.jpg');
這一行就是寄送附加檔案,附加檔案的格式如下
 
代碼: [選擇]
function addAttachment($file,
                           $c_type      = 'application/octet-stream',
                           $name        = '',
                            $isfile     = true,
                           $encoding    = 'base64',
                           $disposition = 'attachment',
                           $charset     = '',
                            $language   = '',
                           $location    = '')

  1.使用 Mail_mime() 建立新的 Mail_mime 物件(constructor)。
  2.至少要使用 setTXTBody(), setHTMLBody(), addHTMLImage() 或 addAttachment()
    四者其中之一建立內文或附檔。(當然通常的情況不只使用一個囉)
  3.使用 get() 傳回內文。
  4.使用 headers() 傳回檔頭。
  5.利用傳回的內文與檔頭丟給 Mail::send() 送信。

reference

http://pear.php.net/manual/en/package.mail.mail.intro.php
http://blog.xuite.net/noi1/yamesz/8928129
http://pear.php.net/manual/en/package.mail.mail-mime.example.php
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: micmic32008-10-01 16:35
試試 phpmailer ...讚!....還可以用 gmail
http://www.fwolf.com/blog/post/155
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: appleboy2008-10-01 17:22
如果要用 UTF-8 標題:

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/plain; charset=utf-8'
                );
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: Yamaka2008-10-01 18:53
這篇很不錯啊~~

寄信是許多 PHP 初學者很煩惱問題

尤其是信件的 Mime 跟附檔


建議這篇能否置頂!
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: Darkhero2008-10-01 19:46
響應您的要求..置頂中...
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: appleboy2008-10-01 20:46
感謝 Darkhero 幫忙置頂
我看 ptt PHP 版蠻多人在問 phpmailer 的
這套也是不錯

http://phpmailer.codeworxtech.com/index.php?pg=examples
主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: FIEND2009-06-25 09:42
辛苦了 寫的蠻完整的 pear 測試文....


給作者些個建議...

這樣寫應該會出事   ....... 沒意外 ...

1.
因為 big5 的編碼範圍比 utf-8 碼小.

所以在 convert to big5 時 utf-8 範圍以外的 文字會被 iconv 給 拉斷.

變成一篇壞掉的 email .

這個問題不修掉 , 大家最好不要用它來做 utf-8 convert  to big5 的動作...

如果看不懂

有空可以去找一下 usc 碼 跟 unicode html , 還有 big5 及 utf-8 編碼 的 教學.


2.
有些 web mail 或是 pop3 smtp mail tool 會依 header 的 宣告 來決定 subject 的 編碼.

通常這個問題,盡可能的全都轉成 big5 再打出去 .

不要 content 的 header 是 big5 而 mine 內的 header 是 utf-8 ...

否則在不一樣的 環境下 會有不一樣的問題.

主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: ricky2009-06-25 09:53
要不要用utf-8編碼去寄信是"人"在控制的
使用utf-8編碼的信件,內容居然有非utf-8的字元
那才真的令人冒汗
這些字元本來就不該出現在信件內容裡的不是嗎??
要是出現了
先把當初編輯這個文案的人抓來鞭打教育一下比較實際一些
辛苦了 寫的蠻完整的 pear 測試文....

@@ 不過.... 看到幾行讓小弟冒汗的code ....

給作者一個建議...

這樣寫會出事   ....... 沒意外 ...

1.
utf-8 範圍以外的 文字會被 iconv 給 拉斷.

變成一篇壞掉的 email .

這個問題不修掉 , 大家最好不要用它來做 utf-8 convert  to big5 的動作...

有去找一下 usc 碼 跟 unicode html 的 教學.


2.
有些 web mail 或是 pop3 smtp mail tool 會依 header 的 宣告 來決定 subject 的 編碼.

通常這個問題,儘可能的全都轉成 big5 再打出去 .

不要 content 的 header 是 big5 而 mine 內的 header 是 utf-8 ...

否則在不一樣的 環境下 會有不一樣的問題.


主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: FIEND2009-06-25 09:58
要不要用utf-8編碼去寄信是"人"在控制的
使用utf-8編碼的信件,內容居然有非utf-8的字元
那才真的令人冒汗
這些字元本來就不該出現在信件內容裡的不是嗎??
要是出現了
先把當初編輯這個文案的人抓來鞭打教育一下比較實際一些


我想你應該沒有看懂我的意思...


還有 :

信件內容會出現 utf-8 碼是有可能出現的.

例如 -

某一套系統的 api . soap . rss , db 等... 提供的 encode就是 utf-8 然後你又不能動它.

這時就需要 convert utf-8 to big5 .

所以 如果你覺得它本來就不應該 出現在 mail 的content 內.

我覺得你要磨練的專案經驗可能還有點不足.

主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: ricky2009-06-25 10:42
這年頭有哪個mail client不接受utf-8編碼的
為何要再做一次這種無意義的轉換
來源是什麼目的端就用什麼編碼
不要再搞這種前端跟後端編碼不一致的東西
這樣只會徒增維護人員的困擾
此外謂何會搞出一個
mime header跟content不同編碼的東西
他們本來不就是該編碼相同的嗎?


ps:我的專案經驗足不足夠不需要你來質疑,這由我老闆去評論就好。
FIEND兄,您的回覆的語氣令我還挺不舒服的。



要不要用utf-8編碼去寄信是"人"在控制的
使用utf-8編碼的信件,內容居然有非utf-8的字元
那才真的令人冒汗
這些字元本來就不該出現在信件內容裡的不是嗎??
要是出現了
先把當初編輯這個文案的人抓來鞭打教育一下比較實際一些


我想你應該沒有看懂我的意思...


還有 :

信件內容會出現 utf-8 碼是有可能出現的.

例如 -

某一套系統的 api . soap . rss , db 等... 提供的 encode就是 utf-8 然後你又不能動它.

這時就需要 convert utf-8 to big5 .

所以 如果你覺得它本來就不應該 出現在 mail 的content 內.

我覺得你要磨練的專案經驗可能還有點不足.


主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: FIEND2009-06-25 10:51
這年頭有哪個mail client不接受utf-8編碼的
為何要再做一次這種無意義的轉換
來源是什麼目的端就用什麼編碼
不要再搞這種前端跟後端編碼不一致的東西
這樣只會徒增維護人員的困擾
此外謂何會搞出一個
mime header跟content不同編碼的東西
他們本來不就是該編碼相同的嗎?


ps:我的專案經驗足不足夠不需要你來質疑,這由我老闆去評論就好。
FIEND兄,您的回覆的語氣令我還挺不舒服的。

我覺得 "不需要 convert...... " 是你的看法.

因為你說不需要 , 我才想建議你 如果你碰到的專案類型再多一點就有機會碰到.

我只是建議 , 沒有強迫你一定要接受我的意見.

還有 我沒有覺得自己的語氣差說 ^^!! , 我沒用什麼難聽的字眼.

因為 utf-8 convert 在很多 需求會碰到 尤其是 api 串接上拿到的資料 .

還有解決問題 不能只解決眼前的問題 , 要考慮長久及有可能發生的問題.

我是真的覺得你專案經驗不足 , 而且誠心的建議您 design 時想遠一點

不過從bbs 看你的文章來評估你專案經驗不足確實有點主觀.

若有開罪您 在此說聲報歉 .


主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: ricky2009-06-25 11:50
Fiend兄或許你誤會我的意思
API串接跟寄送email是兩回事,請不要模糊掉了焦點
單就mail寄送這回事
來源資料是big5,送出的就用big5
來源資料是utf-8,送出的就用utf-8
謂何要把所有的東西統統弄成big5或是utf-8
接著遇到的問題就是不同字集轉換無法match
又得另外用html unicode去解決
如果mail的content是text編碼呢?
為了解決一個問題卻又衍生出更多的問題


這年頭有哪個mail client不接受utf-8編碼的
為何要再做一次這種無意義的轉換
來源是什麼目的端就用什麼編碼
不要再搞這種前端跟後端編碼不一致的東西
這樣只會徒增維護人員的困擾
此外謂何會搞出一個
mime header跟content不同編碼的東西
他們本來不就是該編碼相同的嗎?


ps:我的專案經驗足不足夠不需要你來質疑,這由我老闆去評論就好。
FIEND兄,您的回覆的語氣令我還挺不舒服的。

我覺得 "不需要 convert...... " 是你的看法.

因為你說不需要 , 我才想建議你 如果你碰到的專案類型再多一點就有機會碰到.

我只是建議 , 沒有強迫你一定要接受我的意見.

還有 我沒有覺得自己的語氣差說 ^^!! , 我沒用什麼難聽的字眼.

因為 utf-8 convert 在很多 需求會碰到 尤其是 api 串接上拿到的資料 .

還有解決問題 不能只解決眼前的問題 , 要考慮長久及有可能發生的問題.

我是真的覺得你專案經驗不足 , 而且誠心的建議您 design 時想遠一點

不過從bbs 看你的文章來評估你專案經驗不足確實有點主觀.

若有開罪您 在此說聲報歉 .



主題: 回覆: [PHP] 好用的 PEAR - PHP Mail and Mail_Mime
作者: FIEND2009-06-25 15:21

1.
我應該沒有模糊焦點 -

我上頭是說 ( api 串接上拿到的資料 )

我不是直接說 api 串接  .

例如 -

假設我的系統本身是用 big5 編碼 , 然後我不得不去取得 api 上的字串 , 而 api 上的字串 又剛好是 utf-8 編碼 , 這時就不得不做 convert 了.

不好意思 我沒料到您沒法子想像會有這樣的狀況發生.

所以你才會覺得我在模糊焦點吧.


2.
我想我沒誤會你的意思 ,所以我才會再建議你 ,

一個好的設計 應該是要把可能的情況都考慮進來的.

做convert 轉換 雖然痛 , 但是只要解決就可以符合未來的所有情況.

一套系統寫一次就好了 ,如果每次需求一來 ,狀況一來 , 就要改程式.

一個有經驗的工程師應該會在開發一個功能前就把可能發生的所有情況都考慮好.

否則 在大型的專案下 會做的蠻辛苦的 尤其是在高流量和功能及需求變動很大的環境之下.


3.
我覺得這件事沒什麼好爭的 ,

如果我做的是幾十萬以下的案子 ,而且做過明年還打算再賺維護費,

我想我才不管你三七二十一 反正能work 先寫給你再說.

但是站在 product 或是 services 一個 channel 開發的角度來看 ,

應該會發生蠻多問題的.






Fiend兄或許你誤會我的意思
API串接跟寄送email是兩回事,請不要模糊掉了焦點
單就mail寄送這回事
來源資料是big5,送出的就用big5
來源資料是utf-8,送出的就用utf-8
謂何要把所有的東西統統弄成big5或是utf-8
接著遇到的問題就是不同字集轉換無法match
又得另外用html unicode去解決
如果mail的content是text編碼呢?
為了解決一個問題卻又衍生出更多的問題