Laravel 8配置Gmail SMTP发自动邮件未收到及PDF附件添加问题
Gmail收不到邮件的排查方案
- 优先检查Gmail账号权限配置:谷歌已停止支持「低安全性应用访问」,必须先开启邮箱账号的两步验证,之后生成16位应用密码,替换.env配置中MAIL_PASSWORD字段的值,不可直接使用账号原登录密码。
- 清理配置缓存:修改.env配置后,需执行
php artisan config:clear命令清理配置缓存,否则项目会读取旧的缓存配置导致配置不生效。 - 检查邮箱分类:测试邮件可能被 Gmail 自动归类到垃圾邮件、推广/促销标签页,可优先到对应目录查找。
- 排查发信日志:打开
storage/logs/laravel.log文件查看是否存在发信相关报错;也可临时将.env中MAIL_MAILER值改为log,访问发信路由后查看日志中是否生成了完整的邮件内容,确认代码逻辑无问题。 - 尝试替换端口加密方案:可将MAIL_PORT改为465,MAIL_ENCRYPTION改为ssl,重新测试发信。
PDF附件添加位置
attachData方法需链式添加到TestMail类的build方法中,有两种常用实现方式:
- 直接在Mailable类中生成PDF
public function build() { // 此处为你生成PDF的业务逻辑,按实际需求替换 $pdf = PDF::loadView('pdf.business_template', ['data' => $this->details]); return $this->subject('Test Mail from Veronica') ->view('mail') ->attachData($pdf->output(), 'document.pdf', [ 'mime' => 'application/pdf', ]); }
- 控制器生成PDF后传入Mailable
如果PDF生成逻辑在控制器中完成,可通过构造方法传入TestMail:
- 控制器修改:
public function sendEmail() { $details = [ 'title' => 'Mail from veronica', 'body' => 'This is for testing' ]; // 生成业务PDF,$yourData替换为实际业务数据 $pdf = PDF::loadView('pdf.business_template', ['business_data' => $yourData]); Mail::to("receivermail@gmail.com")->send(new TestMail($details, $pdf)); return "Email sent"; }
- TestMail类修改:
class TestMail extends Mailable { use Queueable, SerializesModels; public $details; public $pdf; // 新增PDF属性 public function __construct($details, $pdf) { $this->details = $details; $this->pdf = $pdf; } public function build() { return $this->subject('Test Mail from Veronica') ->view('mail') // 直接使用传入的PDF实例 ->attachData($this->pdf->output(), '业务数据文档.pdf', [ 'mime' => 'application/pdf', ]); } }
内容的提问来源于stack exchange,提问作者Veronica
相关产品推荐
相关产品推荐

