Laravel在cPanel生产环境使用Gmail发件失败,本地正常求助
Laravel Gmail SMTP 535认证失败问题(cPanel生产环境)
问题核心
本地运行正常,cPanel生产环境报535 Authentication Failed,本质是Gmail的安全机制限制了非信任环境的登录,或服务器网络/配置问题导致认证失败。
修复步骤
1. 启用Gmail应用专用密码(必做)
Gmail默认禁止"低安全性应用"登录,即使输入正确密码也会认证失败,必须通过两步验证+应用专用密码解决:
- 登录Google账号,开启「两步验证」(路径:账号设置 -> 安全 -> 两步验证)
- 开启后,在同一页面找到「应用专用密码」,生成一个用于Laravel的专用密码
- 将
.env中的MAIL_PASSWORD替换为这个生成的专用密码,不要用原邮箱密码
2. 修正Laravel邮件配置
尝试切换端口和加密方式,部分cPanel服务器可能屏蔽465端口,改用587+TLS:
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=test_email@gmail.com MAIL_PASSWORD=你的应用专用密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=test_email@gmail.com MAIL_FROM_NAME="${APP_NAME}"
部署后务必清除配置缓存:
php artisan config:cache
(cPanel环境可通过「终端」工具执行该命令)
3. 检查cPanel服务器网络限制
- 联系主机商确认服务器是否允许出站连接到
smtp.gmail.com的465/587端口,部分主机商会默认限制外部SMTP流量 - 可通过终端执行
telnet smtp.gmail.com 587测试连通性,能正常连接则端口无问题
4. 可选:配置SPF/DKIM提升送达率
在cPanel域名管理中添加SPF记录:
v=spf1 include:_spf.google.com ~all
若使用Google Workspace,可进一步配置DKIM记录,避免邮件被标记为垃圾邮件
替代邮件服务器建议
如果Gmail的配置仍无法解决,推荐以下更稳定的方案:
方案1:cPanel自带邮件服务器
直接使用cPanel创建的域名邮箱,无需依赖外部服务:
MAIL_MAILER=smtp MAIL_HOST=localhost MAIL_PORT=25 MAIL_USERNAME=your-email@yourdomain.com MAIL_PASSWORD=你的cPanel邮箱密码 MAIL_ENCRYPTION=null
方案2:SendGrid(免费额度充足)
免费版每月可发送10000封邮件,配置简单:
MAIL_MAILER=smtp MAIL_HOST=smtp.sendgrid.net MAIL_PORT=587 MAIL_USERNAME=apikey MAIL_PASSWORD=你的SendGrid API密钥 MAIL_ENCRYPTION=tls
方案3:Mailgun
适合Laravel项目,免费版每月可发送5000封邮件,配置逻辑与SendGrid一致
附:你提供的代码修正(转义字符还原)
.env配置(原内容)
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=465 MAIL_USERNAME=test_email@gmail.com MAIL_PASSWORD=************** MAIL_ENCRYPTION=ssl
控制器代码
if (strlen($password_generado) > 0) { $usuario = DB::table('users') ->where('email', $request->correo) ->update([ 'password' => $NewPass, ]); //Send email Mail::to($request->correo)->send(new Subscribe($request->correo, $request->nombre, $password_generado)); return 1; } else { return 2; }
邮件模型代码
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class Subscribe extends Mailable { use Queueable, SerializesModels; public $email; public $user; public $pass; /** * Create a new message instance. * * @return void */ public function __construct($email, $user, $pass) { $this->email = $email; $this->user = $user; $this->pass = $pass; } /** * Build the message. * * @return $this */ public function build() { return $this->subject('Gracias por unirte a GPC') ->markdown('emails.subscribers'); } }
视图代码
@component('mail::message') # Bienvenido a GPC Querido {{$user}} Ten enviamos este mensaje para que puedas acceder al sistemas GPC Usuario -> {{$email}}<br> Contraseña -> {{$pass}} @component('mail::button', ['url' => 'https://campus.com/login']) Ingreso GPC @endcomponent Gracias,<br> {{ config('app.name') }} @endcomponent
内容的提问来源于stack exchange,提问作者Hans_Cusco
相关产品推荐
相关产品推荐

