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
相关产品推荐
相关产品推荐

