首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 郵件發送實戰:基於 PHPMailer 的登入驗證碼發送機制

     編輯:PHP 相關知識

為提升帳號安全性,實作「新裝置登入需郵件驗證碼」功能:記錄常用登入 IP,異地登入時發送時效性驗證碼至信箱,驗證通過後信任該 IP。核心依賴 PHPMailer 庫處理 SMTP 發信。

整合 PHPMailer

// 下載解壓後引入核心類別
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 '發送失敗,請稍後再試';
}
?>

安全性強化重點

  • 驗證碼強度:6 位數字或字母數字混合,避免簡單預測
  • 時效控制:嚴格限制有效期限(建議 5-15 分鐘)
  • 頻率限制:同 IP/帳號單位時間發送上限,防濫發
  • 日誌審計:記錄發送、驗證成功/失敗、IP 變更等關鍵事件
  • HTTPS 強制:整站啟用 TLS,保護驗證碼傳輸過程

常見問題排查

  1. Gmail 需開啟「低安全性應用程式存取權」或使用應用程式密碼
  2. 本地測試需確認 25/465/587 埠未被防火牆攔截
  3. 大量發送建議使用專業郵件服務(SendGrid、Mailgun、Amazon SES)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved