:::
14-5 寄發通知信
- 基本上,在windows下寄信得先設定一下。
一、UniForm Server的寄信設定
- 如果您用的是XUniForm Server,我們可以透過Gmail來讓網站可以寄信。
- 您可以開啟控制台,選擇「General→Mail utility msmtp」來進行寄信設定。

- 開啟後,右邊下拉選單可先選擇「Gmail」,然後點選「Edit configuration File」來編輯設定檔。

- 開啟後,找到Gmail的設定部份,請如下圖輸入您的Gmail帳號及密碼(請將中文字的部份以實際資料替換掉)

- 接著拉到檔案最下方,確認預設用的是Gmail來寄信(若不是,請手動修改之)

- 最後請按「Ctrl+S」來儲存設定檔。
- 然後可以透過這個設定畫面來測試寄信功能是否正常:

- 順利的話,應該就可以收到信件了!

- 實際使用時,Google會要求 [允許安全性較低的應用程式] 設定處於啟用狀態,如此才收得到信。
二、寄信函數
- 在PHP中,寄信的函數是mail(),不過要寄出一封可以支援網頁語法的信需要較多設定,所以,我們自己另做一個函數(放在 fintion.php 中):
//寄信 function send_mail($to, $subject, $message, $from) { if ($to and $subject and $message) { $headers = "MIME-Version: 1.0\r\n" . "Content-type: text/html; charset=utf-8\r\n" . "From: {$from}\r\n"; mail($to, $subject, $message, $headers); } } -
其中 $headers 就是告知收信軟體這封信是有支援網頁語法的檔頭。
-
最後,只要在報名完,順便寄個通知信即可:
//報名 function signup($action_id) { global $db; $uid = $_SESSION['uid']; $sql = "INSERT INTO `signups` ( `action_id`, `uid`, `signup_date`) VALUES ('{$action_id}', '{$uid}', NOW())"; if (!$db->query($sql)) { throw new Exception($db->error); } $sql = "SELECT * FROM `actions` where `action_id` ='{$action_id}'"; $result = $db->query($sql); if (!$result) { throw new Exception($db->error); } $action = $result->fetch_assoc(); $_SESSION['uid_signup'][] = $action_id; $admin_email = "tad@tn.edu.tw"; $message = "<div>{$_SESSION['name']} 您好:</div><p>您已成功報名「{$action['title']}」活動。</p>"; send_mail($_SESSION['email'], "「{$action['title']}」已報名通知", $message, $admin_email); send_mail($admin_email, "「{$action['title']}」已報名通知", $message, $admin_email); } -
其中,我們用了 $_SESSION['email'],但實際上此變數不存在,所以,我們在login()登入時順便加個 $_SESSION['email']:
if (password_verify($pass, $data['pass'])) { $_SESSION['group'] = $data['group']; $_SESSION['name'] = $data['name']; $_SESSION['uid'] = $data['uid']; $_SESSION['email'] = $data['email']; //抓取該使用者已報名的活動編號 $sql = "SELECT action_id FROM `signups` where `uid`='{$data['uid']}'"; if (!$result2 = $db->query($sql)) { throw new Exception($db->error); } $_SESSION['uid_signup'] = []; while (list($action_id) = $result2->fetch_row()) { $_SESSION['uid_signup'][] = $action_id; } } else { throw new Exception("登入失敗!"); } -
當然,登出時也記得取消之
//登出 function logout() { unset($_SESSION['group']); unset($_SESSION['name']); unset($_SESSION['uid']); unset($_SESSION['uid_signup']); unset($_SESSION['email']); }
14-4 刪除活動得同時刪除報名者