為提升帳號安全性,實作「新裝置登入需郵件驗證碼」功能:記錄常用登入 IP,異地登入時發送時效性驗證碼至信箱,驗證通過後信任該 IP。核心依賴 PHPMailer 庫處理 SMTP 發信。
// 下載解壓後引入核心類別
require("phpmailer/class.phpmailer.php"); // 路徑依專案結構調整
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php'; // Composer 安裝時使用
function sendVerifyCode($toEmail, $code, $ip) {
$mail = new PHPMailer(true);
try {
// SMTP 設定
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'your_email@gmail.com';
$mail->Password = 'your_app_password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
// 寄件人/收件人
$mail->setFrom('noreply@example.com', '系統通知');
$mail->addAddress($toEmail);
// 信件內容
$mail->isHTML(true);
$mail->Subject = '新裝置登入驗證碼';
$mail->Body = "偵測到新 IP ({$ip}) 登入,驗證碼:{$code},10 分鐘內有效。";
$mail->AltBody = "偵測到新 IP ({$ip}) 登入,驗證碼:{$code},10 分鐘內有效。";
$mail->send();
return true;
} catch (Exception $e) {
error_log("郵件發送失敗: {$mail->ErrorInfo}");
return false;
}
}
// 使用範例
$verifyCode = sprintf('%06d', mt_rand(0, 999999));
$_SESSION['verify_code'] = $verifyCode;
$_SESSION['verify_expire'] = time() + 600; // 10 分鐘
$_SESSION['verify_ip'] = $_SERVER['REMOTE_ADDR'];
if (sendVerifyCode('user@example.com', $verifyCode, $_SERVER['REMOTE_ADDR'])) {
echo '驗證碼已發送,請查收信箱';
} else {
echo '發送失敗,請稍後再試';
}
?>