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

PHP发送Gmail邮件方案:解决PHPMailer发信失效问题

PHP适配Gmail SMTP发信的可行方案(替代已下线的低安全应用访问模式)

Gmail下线低安全性应用访问权限后,原有直接填账号密码走SMTP的逻辑已经完全失效,目前有两种稳定可落地的PHP实现方案,不需要替换PHPMailer类库,只需要调整鉴权逻辑即可。

方案1:应用专用密码(适配成本最低,适合个人/内部使用场景)

  • 前置要求:发信使用的Gmail账号必须开启两步验证(2FA),未开启2FA的账号无法使用该方案
  • 操作流程:登录Google账号安全中心,找到「应用专用密码」选项,应用类型选「邮件」,设备名称可自定义填写,生成后保存好返回的16位密码串
  • 代码适配:原有PHPMailer逻辑不需要改动,只需要把原来填写的Gmail账号登录密码,替换为刚生成的16位应用专用密码即可,参考代码:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
    // SMTP服务器基础配置
    $mail->SMTPDebug = SMTP::DEBUG_OFF;
    $mail->isSMTP();
    $mail->Host       = 'smtp.gmail.com';
    $mail->SMTPAuth   = true;
    $mail->Username   = '你的Gmail完整账号@gmail.com';
    $mail->Password   = '你生成的16位应用专用密码'; // 此处替换为应用专用密码,不要填账号原密码
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port       = 465;

    // 收发件人配置
    $mail->setFrom('你的Gmail完整账号@gmail.com', '发件人显示名称');
    $mail->addAddress('收件人邮箱@example.com');
    $mail->addReplyTo('你的Gmail完整账号@gmail.com', '回复接收地址');

    // 邮件内容配置
    $mail->isHTML(true);
    $mail->Subject = '邮件标题';
    $mail->Body    = 'HTML格式邮件正文 <b>支持富文本标签</b>';
    $mail->AltBody = '纯文本格式正文,供不支持HTML的邮箱客户端展示';

    $mail->send();
    echo '邮件发送成功';
} catch (Exception $e) {
    echo "邮件发送失败,错误信息:{$mail->ErrorInfo}";
}

应用专用密码等同于该账号的邮件发送权限密钥,泄露后直接在Google账号安全页删除对应专用密码即可立即失效,不需要修改账号主密码。

方案2:OAuth2.0鉴权(适合生产环境、面向公网的正式产品)

这个方案符合Google官方安全规范,不需要用户提供账号密码、也不强制要求开启2FA,适合多用户场景使用,PHPMailer原生支持XOAUTH2鉴权模式。

  • 前置准备:在Google Cloud平台创建项目,启用Gmail API,创建OAuth2.0客户端凭据,拿到客户端ID、客户端密钥,通过OAuth授权流程拿到对应账号的刷新令牌
  • 依赖安装:执行composer命令安装必要依赖 composer require phpmailer/phpmailer league/oauth2-google
  • 参考代码:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\OAuth;
use League\OAuth2\Client\Provider\Google;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
$gmailAccount = '发信Gmail账号@gmail.com';
$clientId = 'Google Cloud生成的OAuth客户端ID';
$clientSecret = 'Google Cloud生成的OAuth客户端密钥';
$refreshToken = 'OAuth授权流程获取的刷新令牌';

try {
    $mail->isSMTP();
    $mail->Host       = 'smtp.gmail.com';
    $mail->Port       = 465;
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->SMTPAuth   = true;
    $mail->AuthType   = 'XOAUTH2';

    // 初始化OAuth鉴权实例
    $provider = new Google([
        'clientId'     => $clientId,
        'clientSecret' => $clientSecret,
    ]);

    $mail->setOAuth(
        new OAuth([
            'provider'     => $provider,
            'clientId'     => $clientId,
            'clientSecret' => $clientSecret,
            'refreshToken' => $refreshToken,
            'userName'     => $gmailAccount,
        ])
    );

    // 收发件人、邮件内容配置和普通SMTP模式完全一致
    $mail->setFrom($gmailAccount, '发件人显示名称');
    $mail->addAddress('收件人邮箱@example.com');
    $mail->isHTML(true);
    $mail->Subject = 'OAuth模式测试邮件';
    $mail->Body    = '通过OAuth2.0鉴权发送的测试邮件';

    $mail->send();
    echo '邮件发送成功';
} catch (Exception $e) {
    echo "邮件发送失败,错误信息:{$mail->ErrorInfo}";
}

常见问题排查

  • 配置正确但连接超时:优先检查服务器出站规则,确认是否放行smtp.gmail.com的465端口,多数云服务商默认封禁SMTP常用端口,需要提交工单申请解封
  • OAuth模式提示权限不足:测试阶段需要把发信的Gmail账号添加到Google Cloud项目的测试用户白名单,正式对外使用需要提交Google OAuth合规审核
  • 不要尝试任何绕过安全校验的非官方方案,这类方案稳定性极差,且大概率触发Gmail账号风控导致封号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:06:26