Laravel邮件发送失败需依次检查:一、配置.env邮件参数;二、Gmail需启用两步验证并生成App Password;三、确认config/mail.php驱动与传输设置;四、用Mail::raw或Mailable类发测试邮件;五、启用log驱动记录调试日志。

如果您在Laravel项目中需要实现用户注册验证、密码重置或通知类功能,但邮件无法正常发送,则可能是由于邮件服务未正确配置或环境变量设置有误。以下是配置Laravel邮件发送服务的具体方法:
一、配置.env文件中的邮件参数
此步骤用于定义全局邮件服务的基本连接信息,Laravel会自动读取这些值并注入到MailServiceProvider中。确保所有参数与所选邮件服务商的文档一致。
1、打开项目根目录下的.env文件。
2、根据所用邮件服务(如SMTP、Mailgun、SES等)填写对应字段,以SMTP为例:
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your_email@gmail.com
MAIL_PASSWORD=your_app_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_email@gmail.com
MAIL_FROM_NAME="${APP_NAME}"
二、启用Google账户的App Password(适用于Gmail)
当使用Gmail作为SMTP服务时,若启用了两步验证,需生成专用应用密码替代账户密码,否则将因认证失败导致发送失败。
1、登录您的Google账户,进入“管理您的Google账户”页面。
2、点击左侧菜单中的“安全性”选项。
3、在“登录Google”部分,找到并开启“两步验证”。(若已开启则跳过)
4、向下滚动至“应用专用密码”区域,点击进入。
5、在“选择应用”下拉框中选择“邮件”,在“选择设备”中选择“其他(自定义名称)”,输入“Laravel App”。
6、点击“生成”,复制显示的16位密码。
7、将该密码粘贴至.env文件中的MAIL_PASSWORD字段。
三、配置config/mail.php中的驱动与传输设置
此步骤用于显式声明邮件传输方式及扩展参数,尤其适用于多环境差异化配置或使用非标准端口/加密方式的情形。
1、打开config/mail.php文件。
2、确认'default' => env('MAIL_MAILER', 'smtp')与.env中一致。
3、检查'smtp'数组下的键值是否覆盖了必要参数:
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
4、如需强制启用SSL而非TLS,可将encryption设为'ssl',并将port改为465。
四、使用Mail::raw或Mailable类发送测试邮件
此步骤用于验证配置是否生效,通过程序调用触发实际发送行为,并捕获异常以定位问题根源。
1、在routes/web.php中添加临时测试路由:
Route::get('/test-mail', function () { ... });
2、在闭包内调用Mail::to('recipient@example.com')->send(new \App\Mail\TestMail());
3、创建Mailable类:php artisan make:mail TestMail。
4、编辑app/Mail/TestMail.php,在build()方法中设置主题与内容:
return $this->subject('Laravel 邮件测试')->view('emails.test');
5、运行php artisan config:clear与php artisan cache:clear刷新配置缓存。
6、访问/test-mail路径,观察是否返回成功响应或抛出Symfony\Component\Mailer\Exception\TransportException。
五、启用Laravel日志记录邮件事件
此步骤用于在不实际发送邮件的前提下捕获原始邮件数据,便于调试格式、收件人、头信息等细节,避免频繁触发服务商配额限制。
1、修改.env文件中的MAIL_MAILER值为log:
MAIL_MAILER=log
2、确保config/logging.php中'channels' => ['stack', 'single', ...]包含'mail'通道定义。
3、在config/logging.php的'channels'数组中添加以下配置:
'mail' => ['driver' => 'daily', 'path' => storage_path('logs/mail.log'), 'level' => 'debug'],
4、执行测试邮件发送逻辑后,检查storage/logs/mail.log中是否记录了完整的RFC 2822格式邮件内容。

















