邮件
介绍
发送邮件并不复杂。Laravel 基于 Symfony Mailer 组件提供了一个简洁、简单的邮件 API。Laravel 和 Symfony 为 Mailer SMTP 、Mailgun 、Postmark 、 Amazon SES 、 及 sendmail (发送邮件的方式)提供驱动,允许你通过本地或者云服务来快速发送邮件。
配置
Laravel 的邮件服务可以通过 config/mail.php
配置文件进行配置。邮件中的每一项都在配置文件中有单独的配置项,甚至是独有的「传输方式」,允许你的应用使用不同的邮件服务发送邮件。例如,你的应用程序在使用 Amazon SES 发送批量邮件时,也可以使用 Postmark 发送事务性邮件。
在你的 mail
配置文件中,你将找到 mailers
配置数组。该数组包含 Laravel 支持的每个邮件 驱动程序 / 传输方式 配置,而 default
配置值确定当你的应用程序需要发送电子邮件时,默认情况下将使用哪个邮件驱动。
驱动 / 传输的前提
基于 API 的驱动,如 Mailgun 和 Postmark ,通常比 SMTP 服务器更简单快速。如果可以的话, 我们建议你使用下面这些驱动。
Mailgun 驱动
要使用 Mailgun 驱动,可以先通过 composer
来安装 Mailgun
函数库 :
composer require symfony/mailgun-mailer symfony/http-client
接着,在应用的 config/mail.php
配置文件中,将默认项设置成 mailgun
。配置好之后,确认 config/services.php
配置文件中包含以下选项:
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
],
如果不使用 US Mailgun region 区域终端 ,你需要在 service
文件中配置区域终端:
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.eu.mailgun.net'),
],
Postmark 驱动
要使用 Postmark
驱动,先通过 composer
来安装 Postmark
函数库:
composer require symfony/postmark-mailer symfony/http-client
接着,在应用的 config/mail.php
配置文件中,将默认项设置成 postmark
。配置好之后,确认 config/services.php
配置文件中包含如下选项:
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],
如果你要给指定邮件程序使用的 Postmark message stream,可以在配置数组中添加 message_stream_id
配置选项。这个配置数组在应用程序的 config/mail.php 配置文件中:
'postmark' => [
'transport' => 'postmark',
'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
],
这样,你还可以使用不同的 message stream
来设置多个 Postmark 邮件驱动
。
SES 驱动
要使用 Amazon SES
驱动,你必须先安装 PHP
的 Amazon AWS SDK
。你可以可以通过 Composer 软件包管理器安装此库:
composer require aws/aws-sdk-php
然后,将 config/mail.php
配置文件的 default
选项设置成 ses
并确认你的 config/services.php
配置文件包含以下选项:
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
为了通过 session token 来使用 AWS temporary credentials ,你需要向应用的 SES 配置中添加一个 token
键:
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'token' => env('AWS_SESSION_TOKEN'),
],
发送邮件,如果你想传递一些 额外的选项 给 AWS SDK 的 SendEmail
方法,你可以在 ses
配置中定义一个 options
数组:
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'options' => [
'ConfigurationSetName' => 'MyConfigurationSet',
'EmailTags' => [
['Name' => 'foo', 'Value' => 'bar'],
],
],
],
备用配置
有时,已经配置好用于发送应用程序邮件的外部服务可能已关闭。在这种情况下,定义一个或多个备份邮件传递配置非常有用,这些配置将在主传递驱动程序关闭时使用。
为此,应该在应用程序的 mail
配置文件中定义一个使用 failover
传输的邮件程序。应用程序的 failover
邮件程序的配置数组应包含一个 mailers
数组,该数组引用选择邮件驱动程序进行传递的顺序:
'mailers' => [
'failover' => [
'transport' => 'failover',
'mailers' => [
'postmark',
'mailgun',
'sendmail',
],
],
// ...
],
定义故障转移邮件程序后,应将此邮件程序设置为应用程序使用的默认
邮件程序,方法是将其名称指定为应用程序 mail
配置文件中 default
配置密钥的值:
'default' => env('MAIL_MAILER', 'failover'),
生成 Mailables
在构建 Laravel 应用程序时,应用程序发送的每种类型的电子邮件都表示为一个 mailable
类。这些类存储在 app/Mail 目录中。 如果你在应用程序中看不到此目录,请不要担心,因为它会在你使用 make:mail Artisan 命令创建第一个邮件类时自然生成:
php artisan make:mail OrderShipped
编写 Mailables
一旦生成了一个邮件类,就打开它,这样我们就可以探索它的内容。邮件类的配置可以通过几种方法完成,包括 envelope
、content
和 attachments
方法。
envelope
方法返回 Illuminate\Mail\Mailables\Envelope
对象,该对象定义邮件的主题,有时还定义邮件的收件人。content
方法返回 Illuminate\Mail\Mailables\Content
对象,该对象定义将用于生成消息内容的Blade模板。
配置发件人
使用 Envelope
首先,让我们来看下如何配置电子邮件的发件人。电子邮件的「发件人」。有两种方法可以配置发送者。首先,你可以在邮件信封上指定「发件人」地址:
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Envelope;
/**
* 获取邮件信封。
*/
public function envelope(): Envelope
{
return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
subject: '订单发货',
);
}
除此之外,还可以指定 replyTo
地址:
return new Envelope(
from: new Address('jeffrey@example.com', 'Jeffrey Way'),
replyTo: [
new Address('taylor@example.com', 'Taylor Otwell'),
],
subject: '订单发货',
);
使用全局 from
地址
当然,如果你的应用在任何邮件中使用的「发件人」地址都一致的话,在你生成的每一个 mailable 类中调用 from
方法可能会很麻烦。因此,你可以在 config/mail.php
文件中指定一个全局的「发件人」地址。当某个 mailable 类没有指定「发件人」时,它将使用该全局「发件人」:
'from' => ['address' => 'example@example.com', 'name' => 'App Name'],
此外,你可以在 config/mail.php
配置文件中定义全局 「reply_to」 地址:
'reply_to' => ['address' => 'example@example.com', 'name' => 'App Name'],