You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHPMailer在Google Cloud生产服务器无报错但无法发邮件求助

解决Google Cloud服务器上PHPMailer连接Gmail SMTP的问题

刚帮客户排查过几乎一模一样的场景——Google Cloud服务器上用PHPMailer连Gmail SMTP,关了两步验证、开了低安全应用还是连不上。核心问题通常出在Google Cloud的网络限制PHPMailer的SMTP模式未启用,或者Google最新的安全策略拦截上,咱们一步步来解决:

先看你代码里的致命小问题

你代码里注释掉了$mail->isSMTP();这一行!这意味着PHPMailer默认会用服务器的mail()函数发送邮件,而不是走Gmail的SMTP通道——这是最容易忽略的点,先把它打开!

分步解决方案

1. 启用SMTP模式并改用TLS端口(优先尝试)

Gmail的SMTP支持465(SSL)和587(TLS)端口,但Google Cloud服务器对587端口的兼容性更好,而且你之前没启用SMTP模式,这是核心问题。修改后的代码如下:

<?php
require ('PHPMailer/PHPMailerAutoload.php');
$mail = new PHPMailer;

// 必须启用SMTP模式,之前注释掉了这一行是关键!
$mail->isSMTP();

// 开启调试模式,查看详细连接日志(排查完可以关掉)
$mail->SMTPDebug = 2;

$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'allthingsremainhere@gmail.com';
$mail->Password = 'your-password'; // 或者后面提到的应用专用密码
$mail->SMTPSecure = 'tls'; // 改用TLS协议
$mail->Port = 587; // 对应TLS的端口

$mail->SetFrom('youcanreply@lishup.com', 'Reply It! - LishUp');
$mail->AddAddress('techgoeshere@gmail.com', 'Tech');
$mail->Subject = 'First PHPMailer Message';
$mail->Body = 'Hi! This is my first e-mail sent through PHPMailer.';

if(!$mail->send()) {
    echo 'Message was not sent.';
    echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent.';
}
?>

2. 检查Google Cloud的出站防火墙规则

Google Cloud的VPC防火墙默认可能限制出站流量,你需要确保服务器能访问smtp.gmail.com的587或465端口:

  • 登录Google Cloud控制台,进入你的项目的VPC网络 > 防火墙
  • 创建一条出站规则,允许目标IP为smtp.gmail.com(或直接允许所有出站到TCP 587/465端口)
  • 确保规则应用到你的服务器实例所在的子网

3. 改用Google应用专用密码(替代低安全应用)

Google现在对“允许低安全性应用”的支持越来越严格,哪怕你开了,在云服务器环境下也可能被拦截。建议创建应用专用密码

  • 登录你的Google账号,进入安全 > 应用专用密码(如果看不到这个选项,先临时开启两步验证,创建完密码再关掉也可以)
  • 生成一个针对“邮件”应用的专用密码,替换代码里的普通密码

4. 升级到OAuth2认证(长期解决方案)

低安全应用和应用专用密码都是过渡方案,Google最终会淘汰这些方式。最稳定的方式是用OAuth2认证,步骤大致如下:

  1. 在Google Cloud控制台创建项目,启用Gmail API
  2. 创建OAuth客户端ID(类型选“桌面应用”或“Web应用”,根据你的场景)
  3. 获取刷新令牌(可以用PHPMailer提供的OAuth示例脚本生成)
  4. 修改PHPMailer配置,添加OAuth2参数:
$mail->AuthType = 'XOAUTH2';
$mail->oauthUserEmail = 'allthingsremainhere@gmail.com';
$mail->oauthClientId = '你的客户端ID';
$mail->oauthClientSecret = '你的客户端密钥';
$mail->oauthRefreshToken = '你的刷新令牌';

5. 检查服务器本地防火墙/SELinux

如果是Linux服务器,本地的UFW防火墙或SELinux可能限制了出站连接:

  • ufw allow 587/tcp命令允许587端口出站
  • setsebool -P httpd_can_sendmail on命令允许Web服务器发送邮件(如果是Apache/Nginx环境)

关键调试技巧

开启$mail->SMTPDebug = 2;后,你会看到详细的SMTP交互日志,比如:

  • 如果显示Connection refused:说明端口被防火墙拦截,检查Google Cloud或本地防火墙
  • 如果显示SSL handshake failed:说明TLS连接有问题,尝试换465端口或检查服务器的SSL证书配置
  • 如果显示Invalid credentials:说明密码或OAuth参数有误,重新核对

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

火山引擎 最新活动