Laravel 基于热门的 SwiftMailer 函数库之上,提供了一个简洁的 API。邮件配置文件为 config/mail.php
,包含若干选项,让您可以更改 SMTP 主机、连接端口、凭证,也可以让您对函数库发送出去的所有消息配置全局的 from
地址。您可使用任何您想要的 SMTP 服务器。如果想使用 PHP mail
函数来发送邮件,您可以将配置文件中的 driver
更改为 mail
。您也可以使用 sendmail
驱动器。
Laravel 也包含了 Mailgun 及 Mandrill HTTP API 的驱动。这些 API 通常比 SMTP 服务器更简单快速。这两套驱动都需要在应用程序中安装 Guzzle 4 HTTP 函数库。您可在 composer.josn
中加入下列代码, 以便在应用中加入 Guzzle 4:
"guzzlehttp/guzzle": "~4.0"
要使用 Mailgun 驱动,请将 config/mail.php
配置文件中的 driver
选项配置为 mailgun
。接下来,若 config/service.php
配置文件还不存在于您的应用中,请建立此文件,并确认其包含下列选项:
'mailgun' => array(
'domain' => 'your-mailgun-domain',
'secret' => 'your-mailgun-key',
),
要使用 Mandrill 驱动,将 config/mail.php
配置文件中的 driver
选项配置为 mandrill
。接下来,若 config/service.php
配置文件还不存在于您的应用中,请建立此文件,并确认其包含下列选项:
'mandrill' => array(
'secret' => 'your-mandrill-key',
),
若您的 config/mail.php
配置文件中的 driver
选项配置为 log
,所有的电子邮件都会被写入日志文件,而不会真正寄给任何收件者。这主要用于快速的本地端除错及内容验证。
您可使用 Mail::send
方法来发送电子邮件消息:
Mail::send('emails.welcome', array('key' => 'value'), function($message)
{
$message->to('[email protected]', 'John Smith')->subject('Welcome!');
});
传入 send
方法的第一个参数为邮件视图的名称。第二个是传递给该视图的数据,通常是一个关联式数组,让视图可通过 $key
来取得数据对象。第三个参数是一个闭包,可以对 message 进行各种配置。
注意:
$message
变量总是会被传入邮件视图中,并且允许内嵌附件。因此最好避免在您的视图本体中传入message
变量。
除了 HTML 视图外,您也可以指定使用纯文本视图:
Mail::send(array('html.view', 'text.view'), $data, $callback);
或者,您可使用 html
或 text
作为键值来指定单一类型的视图:
Mail::send(array('text' => 'view'), $data, $callback);
您也可以在邮件消息中指定其他选项,例如副本收件者或附件:
Mail::send('emails.welcome', $data, function($message)
{
$message->from('[email protected]', 'Laravel');
$message->to('[email protected]')->cc('[email protected]');
$message->attach($pathToFile);
});
要附加文件至 message 时,可以指定 MIME 的类型、显示名称:
$message->attach($pathToFile, array('as' => $display, 'mime' => $mime));
若您只需发送一个简单的字串而非完整的视图,可使用 raw
方法:
Mail::raw('Text to e-mail', function($message)
{
$message->from('[email protected]', 'Laravel');
$message->to('[email protected]')->cc('[email protected]');
});
注意: 传递至
Mail::send
闭包的 message 实例是继承了 SwiftMailer 的 message 类,你可以调用该类的任何方法来建立电子邮件消息。
在电子邮件中嵌入内部图像通常很麻烦;然而 Laravel 提供一个便利的方法让您对电子邮件附加图像,并取得相应的 CID。
<body>
这是一张图像:
<img src="<?php echo $message->embed($pathToFile); ?>">
</body>
<body>
这是一张从原始数据来的图像:
<img src="<?php echo $message->embedData($data, $name); ?>">
</body>
请注意 Mail
类总是会将 $message
变量传递给电子邮件视图。
发送电子邮件消息会大幅延长应用程序的响应时间,因此许多开发者选择将邮件消息加入队列并于后台发送。 Laravel 使用内置 统一的 queue API ,让您轻松地完成此工作。要将邮件消息加入队列,只要使用 Mail
类的 queue
方法:
Mail::queue('emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'John Smith')->subject('Welcome!');
});
您也可以使用 later
方法来指定您希望延迟发送邮件消息的秒数:
Mail::later(5, 'emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'John Smith')->subject('Welcome!');
});
若您想要指定特定的队列或「管道」来加入消息,您可使用 queueOn
以及 laterOn
方法:
Mail::queueOn('queue-name', 'emails.welcome', $data, function($message)
{
$message->to('[email protected]', 'John Smith')->subject('Welcome!');
});
当开发发送电子邮件的应用程序时,我们通常希望不要真的从本地端或开发环境发送邮件。您可以使用 Mail::pretend
方法或将 config/mail.php
配置文件中的 pretend
选项配置为 true
。在 pretend
模式下,消息会改而写入应用程序的日志文件,而不会真的发送给收件者。
若您想要实际阅览测试的邮件,可考虑使用如 MailTrap 的服务。