Tuesday, January 26, 2010

PHPMailer 利用 GMail 發信

偶爾會想要用簡單的小程式來寄信,寶尼推薦 PHPMailer 因為它確實是一個簡單又好用的工具喔。而且不需要去設定 php.ini 內的 sendmail 以及 port,完完全全跟我們現行的系統平台切割。換個角度說,也稱為完完全全相容,因為檔案下載下來之後,解壓縮就可以使用,還不用更換到原先的設定值,這樣是不是很有趣呢?

以下為建立步驟

1. 下載 PHPMailer 類別檔案

可以到 sourceforge.net 下載,PHPMailer 專案的連結

2. 如何安裝 PHPMailer 呢?

解壓縮後僅需要 class.phpmailer.php, class.pop3.php, class.smtp.php 三個檔案,把它放在程式欲執行的目錄即可。

3. 撰寫 PHPMailer 測試程式
<?php
// 解壓縮後的檔案位置
include("class.phpmailer.php");

// 產生 Mailer 實體
$mail = new PHPMailer();

// 設定為 SMTP 方式寄信
$mail->IsSMTP();

// SMTP 伺服器的設定,以及驗證資訊
$mail->SMTPAuth = true;      
$mail->SMTPSecure = "ssl";    
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;

// 信件內容的編碼方式       
$mail->CharSet = "utf-8";

// 信件處理的編碼方式
$mail->Encoding = "base64";

// SMTP 驗證的使用者資訊
$mail->Username = "XXX@gmail.com";
$mail->Password = "XXX";     

// 信件內容設定  
$mail->From = "XXX@gmail.com";
$mail->FromName = "系統測試";
$mail->Subject = "PHPMailer寄信測試標題"; 
$mail->Body = "這是一封測是信件哦!";    
$mail->IsHTML(true);

// 收件人
$mail->AddAddress("YYY@gmail.com", "YYY收信人");

// 顯示訊息
if(!$mail->Send()) {     
echo "Mail error: " . $mail->ErrorInfo;     
}else {     
echo "Mail sent";     
} 
?>

將上述的程式碼存成一個檔案即可,可以測試效果然後去收信看是否正常。

4. 常見問題

  • 標題亂碼: 就是沒有設定郵件編碼,上述編碼在 $mail->Encoding 做設定,亦有 8bit, binary, quoted-printable 的編碼方式哦。
  • 癡癡等待就是收不到信: 如果設定和程式都沒有出錯的話,很大的原因就是 ISP 之問題,例如: 你用 Hinet 上網,也就不允許使用 seednet 或是其他 ISP 的 SMTP 甚至是 GMail 的 SMTP 也會不 Work,因此把設定改成你的線路的 ISP 業者給的囉。
  • 無法正確連線到 SMTP: 請先檢查一下系統平台的 PHP 模組內,是否有 openssl,然後檢察 php.ini 是否有把註解給去掉呢!?
  • 是否需要 SSL: 不一定,要看 ISP 它們提供的 SMTP 服務如何驗證的,因此 $mail->SMTPSecure 可以註解起來,端看環境而言囉,不過 Google SMTP 需要 SSL 驗證,並且 Port 也要正確。
寶尼用 gmail.com 帳號以及 Google Apps 服務的帳號皆可以成功寄信哦。

延伸閱讀

[1.] PHPMailer介紹與使用-自由軟體技術支援資料庫
[2.] 如何利用 Gmail 的SMTP 發信

9 comments:

  1. 請問我在網路上看到與我對應的表格內容為這些就不用了?
    我是連到對方的mail server

    ReplyDelete
  2. maimai:
    你好,如果是連到對方的 mail server,就注意以下的屬性即可。
    // 看對方有沒有支援,不然刪除這兩行也可以
    $mail->SMTPAuth = true;
    $mail->SMTPSecure = "ssl";
    // 以下的屬性一定會有,輸入對應的
    $mail->Host = "對方的Mail server DNS/IP";
    $mail->Port = "對方的Mail server Port";

    您再試看看,希望對您有幫助 :)

    ReplyDelete
  3. 請問我照以上方法做了
    把phpmailer三個檔案置放在
    C:\AppServ\www\system\library
    opencart的後台介面會跑掉
    也無法登入進去
    請問是哪裡出錯了@@?
    謝謝

    ReplyDelete
    Replies
    1. phpmailer 的三個檔案是 php class 的部份,不包含 UI 介面的操作,可能您要先去檢查 CSS 的部份。

      Delete
    2. 幫您 Google 到一篇文章 http://forum.opencart.com/viewtopic.php?t=6301 或許可以直接對照完成喔!!

      Delete
  4. 請問一下 我發生Mail error: The following From address failed:
    該怎麼處理?

    ReplyDelete
    Replies
    1. Hey Leo,
      有點久...
      關於你的 error 訊息,檢查一下 $mail->From 的字串 email 是否存在試試看。

      Delete
  5. No matter how you use your multiple Google accounts it's always a time-saver to be able to log in to more than one Google account at a time. gmail support services

    ReplyDelete
  6. 請問opnecart的發信資料夾是哪一個呢?

    ReplyDelete