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']);
}