TShopping

 找回密碼
 註冊
搜索
查看: 4120|回復: 0
打印 上一主題 下一主題

[教學] PHPMailer如何寄出電子郵件?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-11-16 17:21:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
如何寄出電子郵件?
Kiang 發佈於 01月28日 (7764 次瀏覽)

如何寄出電子郵件?

如果不考慮其他因素,那麼下面這個程式碼就可以順利將郵件寄出,理論上...


  1. mail('kiange@gmail.com', 'How are you', 'Fine, thank you');
複製代碼

前提是系統關於郵件的設定都可以正常使用。三個參數依序代表收件人、主旨與內容,其他可以想得到的部份都會依據系統預設值處理。

如果希望寄送網頁格式的電子郵件,除了在內容中加入 HTML 的各種標籤,可以嘗試提醒使用者瀏覽郵件的程式,讓它更容易判斷信件內容該如何呈現;此時我們會加入下面設定:



  1. mail('kiange@gmail.com', 'How are you',
  2. '<font color="red">Fine,</font><br>thank you', 'Content-type: text/html;');
複製代碼



第四個參數是 header ,一般這裡都會放許多關於內容的組態設定。同樣的設定也可以寄送中文信件,只是為了避免郵件瀏覽軟體誤判內容,我們會在後面加上編碼的宣告:


  1. mail('kiange@gmail.com', '中文測試',
  2. '<font color="red">好的,</font><br>沒問題', 'Content-type: text/html; charset=BIG5');
複製代碼



由於並非所有的郵件系統都能夠順利辨識與處理中文字元(或雙位元組字元),有個日本的朋友(gordon at kanazawa-gu dot ac dot jp)在 PHP 手冊的評論中提供了下面程式碼作為參考:
  1. $charset = "iso-2202-jp"; // japanese
  2. $to = encode("japanese name 01", $charset) . " <" href="mailto:to@email.com>">to@email.com>";
  3. $from = encode("japanese name 02", $charset) . " <" href="mailto:from@email.com>">from@email.com>";
  4. $subject = encode("japanese text");
  5. $message = "does not need to be encoded";
  6. mail($to, $subject, $message, $from);
  7. function encode($in_str, $charset) {
  8.    $out_str = $in_str;
  9.    if ($out_str && $charset) {
  10.        // define start delimimter, end delimiter and spacer
  11.        $end = "?=";
  12.        $start = "=?" . $charset . "?B?";
  13.        $spacer = $end . "rn " . $start;
  14.        // determine length of encoded text within chunks
  15.        // and ensure length is even
  16.        $length = 75 - strlen($start) - strlen($end);
  17.        $length = floor($length/2) * 2;
  18.        // encode the string and split it into chunks  
  19.        // with spacers after each chunk
  20.        $out_str = base64_encode($out_str);
  21.        $out_str = chunk_split($out_str, $length, $spacer);
  22.        // remove trailing spacer and  
  23.        // add start and end delimiters
  24.        $spacer = preg_quote($spacer);
  25.        $out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
  26.        $out_str = $start . $out_str . $end;
  27.    }
  28.    return $out_str;
  29. }
  30. // for details on Message Header Extensions  
  31. // for Non-ASCII Text see ...
  32. // http://www.faqs.org/rfcs/rfc2047.html
複製代碼

如果想要附加檔案呢?這時會需要使用 MIME 格式,可以參考下面這個教學(英文):
http://www.phpbuilder.com/columns/kartic20000807.php3

希望更進一步的使用郵件功能時,需要花蠻多時間去研究 RFC 的定義;不過有個開放原始碼專案幫大家研究了這些文件,然後提供了一套好用的郵件函式庫,目前也廣為開放原始碼專案使用,那就是 PHPMailer :
http://phpmailer.sourceforge.net/

官方網站提供了下面範例:


  1. require("class.phpmailer.php");

  2. $mail = new PHPMailer();

  3. $mail->From     = "list@mydomain.com";
  4. $mail->FromName = "List manager";
  5. $mail->Host     = "smtp1.site.com;smtp2.site.com";
  6. $mail->Mailer   = "smtp";

  7. @MYSQL_CONNECT("localhost","root","password");
  8. @mysql_select_db("my_company");
  9. $query  = "SELECT full_name, email,hotoROM employeeHEREd=$id";
  10. $result =MYSQL_QUERY($query);

  11. while ($row = mysql_fetch_array ($result))
  12. {
  13.     // HTML body
  14.     $body  = "Hello <font size="4">" . $row["full_name"] . "</font>, <p>";
  15.     $body .= "<i>Your</i> personal photograph to this message.<p>";
  16.     $body .= "Sincerely, <br>";
  17.     $body .= "PHPMailer List manager";

  18.     // Plain text body (for mail clients that cannot read HTML)
  19.     $text_body  = "Hello " . $row["full_name"] . ", nn";
  20.     $text_body .= "Your personal photograph to this message.nn";
  21.     $text_body .= "Sincerely, n";
  22.     $text_body .= "PHPMailer List manager";

  23.     $mail->Body    = $body;
  24.     $mail->AltBody = $text_body;
  25.     $mail->AddAddress($row["email"], $row["full_name"]);
  26.     $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");

  27.     if(!$mail->Send())
  28.         echo "There has been a mail error sending to " . $row["email"] . "<br>";

  29.     // Clear all addresses and attachments for next loop
  30.     $mail->ClearAddresses();
  31.     $mail->ClearAttachments();
  32. }
複製代碼


PHPMailer 提供的功能已經足以應付大部分需求,只是郵件系統與郵件閱讀介面之間總有著許許多多的問題存在,經常出現測試環境可以而客戶操作環境出現問題的情況;這些情況發生時可能需要瞭解的資訊就不只大量的 RFC 文件,透過這個網站也許也問不出個所以然來。即使如此,希望大家在研究出解決方式後透過網站分享,這樣子知識才有機會交流與傳承下去。 :)

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-30 12:02 , Processed in 0.058749 second(s), 18 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表