Skip to content

邮件

配置

Laravel 提供了一个干净、简单的 API,封装了流行的 SwiftMailer 库。邮件配置文件是 app/config/mail.php,包含选项,允许您更改 SMTP 主机、端口和凭据,以及为通过该库发送的所有消息设置全局 from 地址。您可以使用任何您希望的 SMTP 服务器。如果您希望使用 PHP 的 mail 函数发送邮件,可以在配置文件中将 driver 更改为 mail。还可以使用 sendmail 驱动。

API 驱动

Laravel 还包括 Mailgun 和 Mandrill HTTP API 的驱动。这些 API 通常比 SMTP 服务器更简单、更快速。这两个驱动都需要将 Guzzle 4 HTTP 库安装到您的应用程序中。您可以通过在 composer.json 文件中添加以下行来将 Guzzle 4 添加到您的项目中:

php
"guzzlehttp/guzzle": "~4.0"

Mailgun 驱动

要使用 Mailgun 驱动,请在 app/config/mail.php 配置文件中将 driver 选项设置为 mailgun。接下来,如果您的项目中尚不存在 app/config/services.php 配置文件,请创建一个。确保它包含以下选项:

php
'mailgun' => array(
	'domain' => 'your-mailgun-domain',
	'secret' => 'your-mailgun-key',
),

Mandrill 驱动

要使用 Mandrill 驱动,请在 app/config/mail.php 配置文件中将 driver 选项设置为 mandrill。接下来,如果您的项目中尚不存在 app/config/services.php 配置文件,请创建一个。确保它包含以下选项:

php
'mandrill' => array(
	'secret' => 'your-mandrill-key',
),

日志驱动

如果您的 app/config/mail.php 配置文件的 driver 选项设置为 log,所有电子邮件将被写入您的日志文件,而不会实际发送给任何收件人。这主要用于快速、本地调试和内容验证。

基本用法

可以使用 Mail::send 方法发送电子邮件消息:

php
Mail::send('emails.welcome', array('key' => 'value'), function($message)
{
	$message->to('foo@example.com', 'John Smith')->subject('欢迎!');
});

传递给 send 方法的第一个参数是应作为电子邮件正文使用的视图名称。第二个是要传递给视图的数据,通常作为关联数组,其中数据项可以通过 $key 在视图中使用。第三个是一个闭包,允许您指定电子邮件消息的各种选项。

lightbulb

一个 $message 变量始终会传递给电子邮件视图,并允许内联嵌入附件。因此,最好避免在视图负载中传递 message 变量。

您还可以指定一个纯文本视图以补充 HTML 视图:

php
Mail::send(array('html.view', 'text.view'), $data, $callback);

或者,您可以使用 htmltext 键仅指定一种类型的视图:

php
Mail::send(array('text' => 'view'), $data, $callback);

您还可以在电子邮件消息上指定其他选项,例如任何抄送或附件:

php
Mail::send('emails.welcome', $data, function($message)
{
	$message->from('us@example.com', 'Laravel');

	$message->to('foo@example.com')->cc('bar@example.com');

	$message->attach($pathToFile);
});

在向消息附加文件时,您还可以指定 MIME 类型和/或显示名称:

php
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
lightbulb

传递给 Mail::send 闭包的消息实例扩展了 SwiftMailer 消息类,允许您调用该类上的任何方法来构建您的电子邮件消息。

嵌入内联附件

将内联图像嵌入到电子邮件中通常很麻烦;然而,Laravel 提供了一种方便的方法来将图像附加到电子邮件中并检索适当的 CID。

在电子邮件视图中嵌入图像

php
<body>
	这里是一张图片:

	<img src="<?php echo $message->embed($pathToFile); ?>">
</body>

在电子邮件视图中嵌入原始数据

php
<body>
	这里是一张来自原始数据的图片:

	<img src="<?php echo $message->embedData($data, $name); ?>">
</body>

请注意,$message 变量始终由 Mail 类传递给电子邮件视图。

队列邮件

队列邮件消息

由于发送电子邮件消息可能会大幅延长应用程序的响应时间,许多开发人员选择将电子邮件消息排队以进行后台发送。Laravel 通过其内置的 统一队列 API 使这变得简单。要排队邮件消息,只需在 Mail 类上使用 queue 方法:

php
Mail::queue('emails.welcome', $data, function($message)
{
	$message->to('foo@example.com', 'John Smith')->subject('欢迎!');
});

您还可以使用 later 方法指定希望延迟发送邮件消息的秒数:

php
Mail::later(5, 'emails.welcome', $data, function($message)
{
	$message->to('foo@example.com', 'John Smith')->subject('欢迎!');
});

如果您希望指定要推送消息的特定队列或“管道”,可以使用 queueOnlaterOn 方法:

php
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
	$message->to('foo@example.com', 'John Smith')->subject('欢迎!');
});

邮件与本地开发

在开发发送电子邮件的应用程序时,通常希望禁用来自本地或开发环境的消息发送。为此,您可以调用 Mail::pretend 方法,或在 app/config/mail.php 配置文件中将 pretend 选项设置为 true。当邮件发送器处于 pretend 模式时,消息将被写入应用程序的日志文件,而不是发送给收件人。

启用假邮件模式

php
Mail::pretend();