|
如何寄出電子郵件?
由 Kiang 發佈於 01月28日 (7764 次瀏覽)
如何寄出電子郵件?
如果不考慮其他因素,那麼下面這個程式碼就可以順利將郵件寄出,理論上...
- mail('kiange@gmail.com', 'How are you', 'Fine, thank you');
複製代碼
前提是系統關於郵件的設定都可以正常使用。三個參數依序代表收件人、主旨與內容,其他可以想得到的部份都會依據系統預設值處理。
如果希望寄送網頁格式的電子郵件,除了在內容中加入 HTML 的各種標籤,可以嘗試提醒使用者瀏覽郵件的程式,讓它更容易判斷信件內容該如何呈現;此時我們會加入下面設定:
- mail('kiange@gmail.com', 'How are you',
- '<font color="red">Fine,</font><br>thank you', 'Content-type: text/html;');
複製代碼
第四個參數是 header ,一般這裡都會放許多關於內容的組態設定。同樣的設定也可以寄送中文信件,只是為了避免郵件瀏覽軟體誤判內容,我們會在後面加上編碼的宣告:
- mail('kiange@gmail.com', '中文測試',
- '<font color="red">好的,</font><br>沒問題', 'Content-type: text/html; charset=BIG5');
複製代碼
由於並非所有的郵件系統都能夠順利辨識與處理中文字元(或雙位元組字元),有個日本的朋友(gordon at kanazawa-gu dot ac dot jp)在 PHP 手冊的評論中提供了下面程式碼作為參考:
- $charset = "iso-2202-jp"; // japanese
- $to = encode("japanese name 01", $charset) . " <" href="mailto:to@email.com>">to@email.com>";
- $from = encode("japanese name 02", $charset) . " <" href="mailto:from@email.com>">from@email.com>";
- $subject = encode("japanese text");
- $message = "does not need to be encoded";
- mail($to, $subject, $message, $from);
- function encode($in_str, $charset) {
- $out_str = $in_str;
- if ($out_str && $charset) {
- // define start delimimter, end delimiter and spacer
- $end = "?=";
- $start = "=?" . $charset . "?B?";
- $spacer = $end . "rn " . $start;
- // determine length of encoded text within chunks
- // and ensure length is even
- $length = 75 - strlen($start) - strlen($end);
- $length = floor($length/2) * 2;
- // encode the string and split it into chunks
- // with spacers after each chunk
- $out_str = base64_encode($out_str);
- $out_str = chunk_split($out_str, $length, $spacer);
- // remove trailing spacer and
- // add start and end delimiters
- $spacer = preg_quote($spacer);
- $out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
- $out_str = $start . $out_str . $end;
- }
- return $out_str;
- }
- // for details on Message Header Extensions
- // for Non-ASCII Text see ...
- // http://www.faqs.org/rfcs/rfc2047.html
複製代碼
如果想要附加檔案呢?這時會需要使用 MIME 格式,可以參考下面這個教學(英文):
http://www.phpbuilder.com/columns/kartic20000807.php3
希望更進一步的使用郵件功能時,需要花蠻多時間去研究 RFC 的定義;不過有個開放原始碼專案幫大家研究了這些文件,然後提供了一套好用的郵件函式庫,目前也廣為開放原始碼專案使用,那就是 PHPMailer :
http://phpmailer.sourceforge.net/
官方網站提供了下面範例:
- require("class.phpmailer.php");
- $mail = new PHPMailer();
- $mail->From = "list@mydomain.com";
- $mail->FromName = "List manager";
- $mail->Host = "smtp1.site.com;smtp2.site.com";
- $mail->Mailer = "smtp";
- @MYSQL_CONNECT("localhost","root","password");
- @mysql_select_db("my_company");
- $query = "SELECT full_name, email,hotoROM employeeHEREd=$id";
- $result =MYSQL_QUERY($query);
- while ($row = mysql_fetch_array ($result))
- {
- // HTML body
- $body = "Hello <font size="4">" . $row["full_name"] . "</font>, <p>";
- $body .= "<i>Your</i> personal photograph to this message.<p>";
- $body .= "Sincerely, <br>";
- $body .= "PHPMailer List manager";
- // Plain text body (for mail clients that cannot read HTML)
- $text_body = "Hello " . $row["full_name"] . ", nn";
- $text_body .= "Your personal photograph to this message.nn";
- $text_body .= "Sincerely, n";
- $text_body .= "PHPMailer List manager";
- $mail->Body = $body;
- $mail->AltBody = $text_body;
- $mail->AddAddress($row["email"], $row["full_name"]);
- $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");
- if(!$mail->Send())
- echo "There has been a mail error sending to " . $row["email"] . "<br>";
- // Clear all addresses and attachments for next loop
- $mail->ClearAddresses();
- $mail->ClearAttachments();
- }
複製代碼
PHPMailer 提供的功能已經足以應付大部分需求,只是郵件系統與郵件閱讀介面之間總有著許許多多的問題存在,經常出現測試環境可以而客戶操作環境出現問題的情況;這些情況發生時可能需要瞭解的資訊就不只大量的 RFC 文件,透過這個網站也許也問不出個所以然來。即使如此,希望大家在研究出解決方式後透過網站分享,這樣子知識才有機會交流與傳承下去。 :) |
|