本文是基于 Laravel 5.1
版本的 Mail
模块代码进行分析书写;
Laravel
基于目前流行的 SwiftMailer
库提供了一套干净清爽的邮件 API
。Laravel
为 SMTP
、Mailgun
、Mandrill
、Amazon SES
、PHP
的 mail
函数,以及sendmail
提供了驱动,从而允许你快速通过本地或云服务发送邮件。
官方 API
地址 https://laravel.com/api/5.1/Illuminate/Mail.html
文件结构
Mail
模块的文件格局及功能如下图所示:
在 MailServiceProvider
文件中,此服务提供者的 register
方法依次做了以下的事:
- 向服务容器注入驱动管理服务
swift.transport
,对应调用的类是TransportManager
; - 向服务容器注入邮件管理服务
swift.mailer
,对应调用的类是Swift_Mailer
; - 向服务容器注入
Laravel
自定义邮件管理服务mailer
, 对应的类是Illuminate\Mail\Mailer
;
首先,实例化Mailer
对象,参数为$app['view']
、$app['swift.mailer']
、$app['events']
;
其次,给Mailer
实例绑定 容器$app
、日志器$app->make('Psr\Log\LoggerInterface')
、队列$app['queue.connection']
对象;
然后,从config/mail.php
读取from
和to
参数,如果存在,即绑定到Mailer
对象中;
最后,根据config/mail.php
配置文件的pretend
参数,修改Mailer
对象的pretending
私有变量,如果该私有变量为true
,则不实际发送邮件,而是写到日志中,便于本地开发调试;
Demo
准备一个用于发送文件的视图,内容如下
1 | <body> |
具体调用代码片段:
1 | Mail::send('mail.email', ['content' => 'Hi!请查收补货单。'], function ($message) use ($email, $file) { |