You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPMailer无法向Gmail发送OTP验证邮件求助

解决PHPMailer发送Gmail验证邮件失败的问题

你的代码存在几处关键配置错误,导致邮件无法正常发送,以下是针对性修复方案:

1. 修正SMTP加密与端口的匹配问题

你当前设置$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS(对应465端口的隐式TLS加密),但端口使用的是587,两者不匹配。587端口需要使用ENCRYPTION_STARTTLS,同时Host无需添加tls://前缀,PHPMailer会自动处理协议:

//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->isSMTP();
$mail->Host       = "smtp.gmail.com"; // 移除tls://前缀
$mail->SMTPAuth   = true;
$mail->Username   = 'tk23@gmail.com';
$mail->Password   = '你的应用专用密码'; // 注意:不能使用普通账号密码
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 对应587端口
$mail->Port       = 587;

2. 解决Gmail身份验证限制

Gmail已禁止使用普通密码通过SMTP登录,你需要:

  • 开启Google账号的两步验证
  • 生成一个应用专用密码,替换代码中的普通密码
  • 若暂时无法开启两步验证,可临时开启"不太安全的应用访问"(不推荐,Google将逐步淘汰该选项)

3. 显示调试信息定位问题

你将调试输出包裹在display:none的div中,无法查看具体错误日志,建议移除这个隐藏容器,直接显示调试信息:

// 移除<div style='display: none;'>包裹
$mail = new PHPMailer(true);

try {
    // 邮件配置与发送代码
} catch (Exception $e) {
    echo "邮件发送失败:{$mail->ErrorInfo}";
}
// 移除对应的</div>

4. 额外优化建议

  • 不要使用md5加密密码,该算法已不安全,改用password_hash()和password_verify()
  • 数据库查询使用预处理语句,避免SQL注入风险

修复后的邮件发送核心代码片段

if ($result) {
    $mail = new PHPMailer(true);

    try {
        //Server settings
        $mail->SMTPDebug = SMTP::DEBUG_SERVER;
        $mail->isSMTP();
        $mail->Host       = "smtp.gmail.com";
        $mail->SMTPAuth   = true;
        $mail->Username   = 'tk23@gmail.com';
        $mail->Password   = '你的应用专用密码';
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = 587;

        //Recipients
        $mail->setFrom('tk23@gmail.com','验证邮件');
        $mail->addAddress($email);

        //Content
        $mail->isHTML(true);
        $mail->Subject = '账号验证通知';
        $mail->Body    = '请点击以下链接完成账号验证:<b><a href="http://localhost/login/?verification='.$code.'">http://localhost/login/?verification='.$code.'</a></b>';

        $mail->send();
        $msg = "<div class='alert alert-info'>验证链接已发送至你的邮箱,请查收。</div>";
    } catch (Exception $e) {
        $msg = "<div class='alert alert-danger'>邮件发送失败:{$mail->ErrorInfo}</div>";
    }
} else {
    $msg = "<div class='alert alert-danger'>注册失败,请稍后重试。</div>";
}

内容的提问来源于stack exchange,提问作者Hyun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:25:04