PHP使用SMTP发送邮件遇错误无法解决,求排查方案
SMTP邮件发送问题排查方案
代码中的致命问题
- 你在代码里调用
var_dump($mail);后立即执行die();,导致核心的$mail->send();方法根本没有运行,这是你看不到实际错误日志的直接原因,先删除这两行代码。
Gmail SMTP专属排查点
- 应用密码验证:若你的Google账号开启了两步验证,必须使用Google生成的应用专用密码替代普通登录密码,普通密码会被SMTP服务器拒绝。
- 账号权限配置:未开启两步验证的账号,需在Google账号设置中启用“允许不太安全的应用访问”(该选项已逐步废弃,优先推荐使用应用密码)。
- 发件人地址规范:Gmail SMTP要求发件人邮箱(
setFrom的参数)必须与SMTP登录账号(Username)一致,禁止使用用户提交的外部邮箱作为发件人。正确做法是用你的Gmail账号作为发件人,通过addReplyTo($from, $name)设置用户邮箱为回复地址。 - 端口与网络检查:587端口搭配
tls加密的配置是正确的,但需确认cPanel主机未封禁587端口,可联系主机服务商核实。 - 调试日志利用:
SMTP::DEBUG_SERVER已开启,删除die()后执行发送,会输出完整的SMTP交互日志,根据日志中的错误代码(如535代表认证失败、550代表发件人权限不足)可精准定位问题。
修正后的核心代码片段
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; require '../vendor/autoload.php'; $mail = new PHPMailer(true); try { $to = 'voicenetechnologies@gmail.com'; $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS); $from = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); $subject = filter_input(INPUT_POST, 'subject', FILTER_SANITIZE_SPECIAL_CHARS); $message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_SPECIAL_CHARS); $mail->SMTPDebug = SMTP::DEBUG_SERVER; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'vo******@gmail.com'; $mail->Password = '你的应用专用密码或授权密码'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->addAddress($to, 'Voicene Technologies'); // 修正发件人为Gmail登录账号 $mail->setFrom('vo******@gmail.com', 'Voicene Technologies'); // 设置用户邮箱为回复地址 $mail->addReplyTo($from, $name); $mail->Subject = $subject; $mail->Body = $message; $mail->send(); echo 'Message has been sent'; } catch (\Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; }
内容的提问来源于stack exchange,提问作者M G
相关产品推荐
相关产品推荐

