Laravel 的 邮件发送功能
简介
Laravel 基于 SwiftMailer 函数库提供了一套干净、简洁的邮件 API ,Laravel 为 SMTP 、Mailgun 、SparkPost 、 Amazon SES 、 PHP 的 mail
函数及 sendmail
提供驱动,让你可以快速从本地或云端服务自由地发送邮件。
驱动前提
基于 API 的驱动,例如 Mailgun 和 SparkPost 通常比 SMTP 服务器更简单快速。如果可能,你应该尽可能使用这些驱动。所有的 API 驱动都需要 Guzzle HTTP 函数库,你可以使用 Composer 包管理器安装它:
composer require guzzlehttp/guzzle
Mailgun 驱动
要使用 Mailgun 驱动,首先必须安装 Guzzle,之后将 config/mail.php
配置文件中的 driver
选项设置为 mailgun
。接下来,确认 config/services.php
配置文件包含以下选项:
'mailgun' => [
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
],
SparkPost 驱动
要使用 SparkPost 驱动,首先必须安装 Guzzle,之后将 config/mail.php
配置文件中的 driver
选项设置为 sparkpost
。接下来,确认 config/services.php
配置文件包含以下选项:
'sparkpost' => [
'secret' => 'your-sparkpost-key',
],
SES 驱动
要使用 Amazon SES 驱动,必须安装 PHP 的 Amazon AWS SDK。你可以在 composer.json
文件的 require
段落加入下面这一行并运行 composer update
命令:
"aws/aws-sdk-php": "~3.0"
接下来,将 config/mail.php
配置文件中的 driver
设置为 ses
。然后确认 config/services.php
配置文件包含下列选项:
'ses' => [
'key' => 'your-ses-key',
'secret' => 'your-ses-secret',
'region' => 'ses-region', // e.g. us-east-1
],
生成 mailables
在 Laravel 中,每种类型的邮件都代表一个「mailables」对象。这些对象存储在 app/Mail
目录中。如果在你的应用中没有看见这个目录,别担心,在首次使用 make:mail
命令创建 mailables 类时这个目录会被创建,例如:
php artisan make:mail OrderShipped
编写 mailables
所有的 「mailables」类都在其 build
方法中完成配置。在这个方法内,你可以调用其他各种方法,如 from
、 subject
、 view
和 attach
来配置完成邮件的详情。
配置发送者
使用 from
方法
首先,演示配置邮件的发送者,也就是邮件的参数 「from」,既谁发送了邮件。有两种方法配置发送者。第一种是你可以在 build
方法中使用 from
方法:
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com')
->view('emails.orders.shipped');
}
使用一个全局 from
地址
然而,如果应用使用相同的 from
地址,你每次发送邮件这种设置方式显得笨拙,替代的方法就是在 config/mail.php
配置文件中设置一个全局 from
地址,这个配置在没有单独指定 「from」时是默认的 from
:
'from' => ['address' => 'example@example.com', 'name' => 'App Name'],
配置视图
在 build
方法内,你可以使用 view
方法指定邮件的模板,以渲染邮件的内容。因为所有邮件都会使用 Blade 模板 渲染内容,你能很容易的使用 Blade 模板引擎构建邮件的 HTML:
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}
你可以创建一个 resources/views/emails
目录来存放所有的邮件模板;然而,这不是强制要求,你可以在有的将邮件模板放在 resources/views
目录的任意位置。
纯文本邮件
如果你想要定义一个纯文本邮件,你可以使用 text
方法。如同 view
方法,text
方法接受一个模板名称,这个名称告诉方法使用哪个模板来渲染邮件,可以自由定义邮件 HTML 和纯文本消息:
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->text('emails.orders.shipped_plain');
}
视图数据
通过公共属性
通常,你会希望传递一些数据来渲染你的邮件的 HTML 。那么有两种方法可以让视图获得数据,第一种,mailable 类任何公共属性都可以在视图中使用。所以,例如你可以传递数据到 mailable 类的构造函数并且在类中定义数据的公共属性:
<?php
namespace App\Mail;
use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* order 实例。
*
* @var Order
*/
public $order;
/**
* 创建一个新消息实例。
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* 构建消息。
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}
}
一旦数据被设置为公共属性,它们将自动在视图中加载,所以你可以访问像访问其他 Blade 模板数据一样访问它们:
<div>
Price: {{ $order->price }}
</div>