邮件
配置
Laravel 提供了一个简洁、简单的 API,基于流行的 SwiftMailer 库。邮件配置文件是 config/mail.php
,其中包含选项,允许您更改 SMTP 主机、端口和凭据,并为库发送的所有消息设置全局 from
地址。您可以使用任何 SMTP 服务器。如果您希望使用 PHP 的 mail
函数发送邮件,可以在配置文件中将 driver
更改为 mail
。也可以使用 sendmail
驱动。
API 驱动
Laravel 还包括 Mailgun 和 Mandrill HTTP API 的驱动。这些 API 通常比 SMTP 服务器更简单、更快。使用这两个驱动都需要在您的应用程序中安装 Guzzle 5 HTTP 库。您可以通过在 composer.json
文件中添加以下行来将 Guzzle 5 添加到您的项目中:
"guzzlehttp/guzzle": "~5.0"
Mailgun 驱动
要使用 Mailgun 驱动,请在 config/mail.php
配置文件中将 driver
选项设置为 mailgun
。接下来,如果您的项目中还没有 config/services.php
配置文件,请创建一个。确保它包含以下选项:
'mailgun' => [
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
],
Mandrill 驱动
要使用 Mandrill 驱动,请在 config/mail.php
配置文件中将 driver
选项设置为 mandrill
。接下来,如果您的项目中还没有 config/services.php
配置文件,请创建一个。确保它包含以下选项:
'mandrill' => [
'secret' => 'your-mandrill-key',
],
日志驱动
如果 config/mail.php
配置文件中的 driver
选项设置为 log
,所有电子邮件将被写入您的日志文件,而不会实际发送给任何收件人。这主要用于快速的本地调试和内容验证。
基本用法
可以使用 Mail::send
方法发送电子邮件消息:
Mail::send('emails.welcome', ['key' => 'value'], function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
传递给 send
方法的第一个参数是应用作电子邮件正文的视图名称。第二个参数是要传递给视图的数据,通常是一个关联数组,其中数据项可以通过 $key
在视图中使用。第三个参数是一个闭包,允许您在电子邮件消息上指定各种选项。
$message
变量始终传递给电子邮件视图,并允许内联嵌入附件。因此,最好避免在视图负载中传递 message
变量。
您还可以指定一个纯文本视图,以便与 HTML 视图一起使用:
Mail::send(['html.view', 'text.view'], $data, $callback);
或者,您可以仅使用 html
或 text
键指定一种视图类型:
Mail::send(['text' => 'view'], $data, $callback);
您还可以在电子邮件消息上指定其他选项,例如任何抄送或附件:
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 类型和/或显示名称:
$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);
如果您只需要发送一个简单的字符串而不是整个视图,可以使用 raw
方法:
Mail::raw('Text to e-mail', function($message)
{
$message->from('us@example.com', 'Laravel');
$message->to('foo@example.com')->cc('bar@example.com');
});
传递给 Mail::send
闭包的消息实例扩展了 SwiftMailer 消息类,允许您调用该类上的任何方法来构建电子邮件消息。
嵌入内联附件
将内联图像嵌入到电子邮件中通常很麻烦;然而,Laravel 提供了一种方便的方法来将图像附加到电子邮件中并检索适当的 CID。
在电子邮件视图中嵌入图像
<body>
这里是一张图片:
<img src="<?php echo $message->embed($pathToFile); ?>">
</body>
在电子邮件视图中嵌入原始数据
<body>
这里是一张来自原始数据的图片:
<img src="<?php echo $message->embedData($data, $name); ?>">
</body>
请注意,$message
变量始终由 Mail
facade 传递给电子邮件视图。
队列邮件
队列邮件消息
由于发送电子邮件消息可能会显著延长应用程序的响应时间,许多开发人员选择将电子邮件消息排队以便后台发送。Laravel 使用其内置的统一队列 API使这变得简单。要将邮件消息排队,只需在 Mail
facade 上使用 queue
方法:
Mail::queue('emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
您还可以使用 later
方法指定希望延迟发送邮件消息的秒数:
Mail::later(5, 'emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
如果您希望指定要将消息推送到的特定队列或“管道”,可以使用 queueOn
和 laterOn
方法:
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
$message->to('foo@example.com', 'John Smith')->subject('Welcome!');
});
邮件与本地开发
在开发发送电子邮件的应用程序时,通常希望禁用从本地或开发环境发送消息。为此,您可以调用 Mail::pretend
方法,或在 config/mail.php
配置文件中将 pretend
选项设置为 true
。当邮件程序处于 pretend
模式时,消息将被写入应用程序的日志文件,而不是发送给收件人。
如果您希望实际查看测试电子邮件,请考虑使用像 MailTrap 这样的服务。