0

0

Laravel中如何实现邮件发送功能_Laravel Mail类配置与发送邮件【实战】

尼克

尼克

发布时间:2026-01-23 14:11:03

|

751人浏览过

|

来源于php中文网

原创

Laravel邮件发送需正确配置MAIL_MAILER及对应驱动参数,清除配置缓存后用Mail::raw()验证SMTP连通性;附件应使用attachFromStorage()配相对路径;队列发送须设置QUEUE_CONNECTION并监听;测试时Mail::fake()会屏蔽真实发送,上线前必须实测。

laravel中如何实现邮件发送功能_laravel mail类配置与发送邮件【实战】

Laravel 的 Mail 类本身不负责实际发信,它只是个门面(Facade),真正干活的是底层的邮件驱动(如 smtpmailgunlog)。能发出去的前提,是驱动配置正确且网络可达。

确认 MAIL_MAILER 和对应驱动配置是否生效

Laravel 从 7.x 起默认使用 MAIL_MAILER 环境变量决定驱动,而非旧版的 MAIL_DRIVER。如果 .env 里还写着 MAIL_DRIVER=smtp,但没设 MAIL_MAILER,Laravel 会静默 fallback 到 log 驱动 —— 邮件根本不会发出,控制台也无报错。

  • MAIL_MAILER=smtp 是必须显式设置的,哪怕你用的是 Mailgun 或 SES
  • SMTP 场景下,MAIL_HOSTMAIL_PORTMAIL_USERNAMEMAIL_PASSWORD 缺一不可;端口注意:587(TLS)和 465(SSL)行为不同,Laravel 默认用 TLS,若服务要求 SSL,得额外配 MAIL_ENCRYPTION=ssl
  • 改完 .env 后务必运行 php artisan config:clear,否则缓存会掩盖配置问题

用 Mail::raw() 快速验证基础通路是否畅通

绕过 Mailable 类、视图渲染等环节,直连 SMTP 发纯文本,能最快定位是配置问题还是业务逻辑问题。

use Illuminate\Support\Facades\Mail;

Mail::raw('Hello from Laravel!', function ($message) {
    $message->to('test@example.com')
            ->subject('Laravel SMTP Test');
});

如果这步失败,错误信息通常明确指向连接拒绝、认证失败或证书问题;如果成功,说明 SMTP 配置没问题,后续可放心构建 Mailable。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

Mailable 类中 attachFromStorage() 与相对路径陷阱

想在邮件里附带存储在 storage/app 下的 PDF 报表?别直接传 storage_path('app/reports/2024.pdf')attach() —— 它只接受绝对路径,且该路径需对 PHP 进程可读。更安全的做法是用 attachFromStorage(),但要注意它默认基于 local 磁盘,且路径是「磁盘内路径」,不含 storage/app/ 前缀:

  • 文件实际存在 storage/app/reports/2024.pdfattachFromStorage('reports/2024.pdf') ✔️
  • 写成 attachFromStorage('storage/app/reports/2024.pdf') ❌(找不到)
  • 若用的是 s3 磁盘,attachFromStorage() 仍可工作,但需确保 S3 凭据有效且文件可公开读(或生成预签名 URL)

队列发送时忘了设置 QUEUE_CONNECTION 导致阻塞

Mail::to(...)->queue(new WelcomeMail()) 时,如果 QUEUE_CONNECTION 仍为默认的 sync,邮件会同步执行 —— 表面上“发成功了”,但用户请求会被 SMTP 延迟拖住。更隐蔽的问题是:若你本地没跑 Redis 或数据库队列监听器,而误以为已启用异步,邮件就卡在 jobs 表或 Redis 里不动。

  • 开发环境快速验证队列:设 QUEUE_CONNECTION=database,运行 php artisan queue:work --once
  • 生产环境务必用 redissupervisor 持续监听,不能依赖 php artisan queue:work 手动触发
  • Mail::fake() 在测试中很好用,但它会吞掉所有发送行为 —— 单测通过不代表线上能发,上线前必须关掉 fake 并真机测一次

邮件发送链条长,任意一环(DNS 解析、防火墙、SMTP 限频、邮箱服务商拒收)都可能让信消失无声。最稳妥的方式是:先用 Mail::raw() 过基础,再用队列发真实 Mailable,最后查收件箱或 SMTP 日志,别只看 Laravel 日志里有没有 “Message sent”。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2822

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1692

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1549

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1036

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1485

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1256

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1609

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 10万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号