本文是基于 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) { |