Recent in Recipes

[奇怪的案例怪談1]如何使用PHP寄送郵件

哈囉!我又出現了!非常非常久沒有打文章了,因為這兩年其實小弟我有一些原因所以比較沒有時間碰,現在可以好好的來介紹一些功能與案例,之後也會介紹一些容易上手的東西,希望大家對於資訊,尤其是程式設計更有興趣。

今天要介紹的是如何使用PHP來寄送郵件,這個功能我覺得對於網站設計應該是很實用的,近期正好有架設網站的需求,以及維護的案例,有幸來跟大家介紹一下,我們使用的套件為PHPMailer,主要架構為PHP撰寫,其實也爬了許多網站這裡來做個統整,首先來先下載PHPMailer套件,提供Github的網址https://github.com/Synchro/PHPMailer
接下來要做的就是些設定,首先打開要設定轉寄寄信的Gmail然後進去後到右上角的齒輪如下圖,然後點下去之後選擇設定

1
※Gmail設定

之後會顯示一些選項,選擇轉寄和POP/IMAP,然後將POP功能與IMAP功能打開如下圖所示

2
※打開POP/IMAP功能

關於POP/IMAP與SMTP呢…還是稍微稍微的介紹一下,先附上資料連結
  1. https://support.office.com/zh-hk/article/imap-%E5%92%8C-pop-%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F-ca2c5799-49f9-4079-aefe-ddca85d5b1c9
  2. https://blog.xuite.net/cyclone/blog/56713570-%E4%B8%80%E6%AC%A1%E6%90%9E%E6%87%82SMTP%E3%80%81POP3%E3%80%81IMAP%E6%98%AF%E4%BB%80%E9%BA%BC
P.S.因為我也是查了資料才知道XD
SMTP是規範在RFC 821,其Port為25,當初是給公司內部郵件傳遞,隨著時間的演進現今的規範比較完整統一了電子郵件的規格。
POP與IMAP的不同為POP為一次下載郵件後刪除,也就是說只有一台能夠讀取郵件資料,IMAP則是在線上讀取資料,不做下載的動作,如果根據現今的要求來看,IMAP是比較符合使用者需求的,因為使用者不可能永遠只用一種裝置看郵件。
PS.其實我有事過沒有設定也可以寄送XD 但是我覺得搞不好是之前有設定然後網頁瀏覽器有記錄到,所以還是乖乖設定比較保險
好的!其實我扯遠了,Gmail的部分還有一個東西要設定,開啟安全性設定開啟允許較低安全性的應用程式將他打開,如下圖所示

3
※允許較低安全性的應用程式

關於Gmail已經設定完成了,還有一個東西要設定(還來啊!=口=’’’) ,既然是PHP當然少不了Web server囉,因為小弟是使用XAMPP來設定,所以我這裡教的是XAMPP的修改,如果是使用AppServ可以參考這篇非常詳細的文章,這篇也解決了我許多問題
http://edu.unethost.com/%E4%B8%BB%E6%A9%9F%E7%9B%B8%E9%97%9C/phpmailer-%E9%81%8B%E7%94%A8gmail%E4%BE%86%E5%AF%84%E4%BF%A11/
打開XAMPP,在Apache中點選PHP.ini 如下圖

4
※XAMPP Apache php.ini

終於我們把需要設定的都設定完了!再來是將套件與程式碼放置Web server中(htdocs資料夾裡),程式碼雖然Github內文中有解說如何使用,不過還是要提供一下程式碼啦!

 
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master/src/Exception.php';
require 'PHPMailer-master/src/PHPMailer.php';
require 'PHPMailer-master/src/SMTP.php';
$content="<p style='color:#F00'>訪客: "."test".", 於官方網站內發出一則詢問信件, 請您務必盡快與他(她)聯絡或回覆詢問!! </p>姓名:"."test"."<br />"."電話:"."0955555555"."<br />"."E-MAIL:"."test@test.org"."<br />"."公司:"."test"."<br />"."<br />"." "."意見或詢問:"."test"."<br/><br/><h4 style='color:#F00'>< 本信件為系統寄發,請勿直接回覆 ></h4>";
$mail= new PHPMailer(); //建立新物件
$mail->IsSMTP(); //使用SMTP方式寄信
$mail->SMTPAuth = true; //設定SMTP需要驗證
$mail->SMTPSecure = "ssl"; // Gmail的SMTP主機需要使用SSL連線
$mail->Host = "smtp.gmail.com"; //Gamil的SMTP主機
$mail->Port = 465; //SMTP預設為25 Gamil的SMTP主機的埠號。
$mail->CharSet = "utf-8"; //郵件編碼
$mail->Username = "XXXX@gmail.com"; //Gamil帳號
$mail->Password = "XXXX"; //Gmail密碼
$mail->From = "epaper@test.com"; //寄件者信箱
$mail->FromName = "TEST Technology Corp."; //寄件者姓名
$mail->Subject ="這是SMTP測試信"; //郵件標題
$mail->Body =$content; //郵件內容
$mail->IsHTML(true); //郵件內容為html
$mail->AddAddress("OOO@gmail.com"); //收件者郵件及名稱
$mail->AddBCC(" "); //設定 密件副本收件者
if(!$mail->Send()){
echo "Fail: " . $mail->ErrorInfo;
}else{
echo "<b>您好!已收到您的留言,會盡快回覆</b>";
}
?>
如果執行以後顯示如下圖就表示成功寄出信件囉!
6
※郵件成功寄出(上為網頁顯示  下為Gmail的執行情況)


 [奇怪的案例怪談1]
最後分享一段奇怪的案例,小弟公司的網站也是用這個功能寄送郵件,而且是2013年的時候就有了(小弟那時候還沒來哈哈哈哈),往後基本上那台server就沒有去動了 (寄送信件php檔最後修改日期是2013年…)。

而故事就發生在2018年11月7號的時候,有其他單位的同人跟我反應說郵件功能有問題,因為我們網站有做一個功能叫”聯絡我們”,這個功能是負責收客戶的信,而我們公司會接許多國外客戶的案子所以這個功能無形中扮演了重要的腳色。

結果我去看錯誤訊息,顯示為SMTP Error: Could not authenticate.,這個訊息我爬了許多文跟改了一堆程式 (就是拿掉後再放回去的循環),搞了我一天的時間,Could not authenticate 我就是要寄信阿,信件為什麼驗證不過呢?它就是信嗎?驗證什麼?...咦!?驗證信件?,於是我隔天把”$mail->SMTPAuth = true; ”這行註解以後…就好了!...見鬼啦!!怎麼回事啊!!怎麼原本沒事的功能突然就掛了!?...算了…已經解決了這個問題可喜可賀!

其實在工作或是研究上都會遇到突然凸槌的問題,自己研究的問題發生影響比較小,因為所有東西是一手掌握,但是工作時候就不一樣,你面對的是前人或是現在的同事一起合作的程式,有時候需要了解對方的邏輯就要一段時間了,以後有機會在分享一些奇怪的案例,那就跟各位介紹到這裡囉!