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

