返回首页 Laravel 官方文档中文版

前言 - Prologue

环境配置 - Setup

基本功能 - The Basics

系统架构 - Architecture Foundations

系统服务 - Services

数据库 - Database

Artisan 命令行工具 - Artisan CLI

邮件

配置

Laravel 基于热门的SwiftMailer 函数库之上,提供了一个简洁的 API。邮件配置文件为config/mail.php,包含若干选项,让您可以更改 SMTP 主机、连接端口、凭证,也可以让您对函数库发送出去的所有消息配置全局的from 地址。您可使用任何您想要的 SMTP 服务器。如果想使用 PHPmail 函数来发送邮件,您可以将配置文件中的driver 更改为mail。您也可以使用sendmail 驱动器。

API 驱动

Laravel 也包含了 Mailgun 及 Mandrill HTTP API 的驱动。这些 API 通常比 SMTP 服务器更简单快速。这两套驱动都需要在应用程序中安装 Guzzle 4 HTTP 函数库。您可在composer.josn 中加入下列代码, 以便在应用中加入 Guzzle 4:

"guzzlehttp/guzzle": "~4.0"

Mailgun 驱动

要使用 Mailgun 驱动,请将config/mail.php 配置文件中的driver 选项配置为mailgun。接下来,若config/service.php 配置文件还不存在于您的应用中,请建立此文件,并确认其包含下列选项:

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

Mandrill 驱动

要使用 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('foo@example.com', 'John Smith')->subject('Welcome!');
});

传入send 方法的第一个参数为邮件视图的名称。第二个是传递给该视图的数据,通常是一个关联式数组,让视图可通过$key 来取得数据对象。第三个参数是一个闭包,可以对 message 进行各种配置。

注意:$message 变量总是会被传入邮件视图中,并且允许内嵌附件。因此最好避免在您的视图本体中传入message 变量。

除了 HTML 视图外,您也可以指定使用纯文本视图:

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

或者,您可使用htmltext 作为键值来指定单一类型的视图:

Mail::send(array('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);
});

要附加文件至 message 时,可以指定 MIME 的类型、显示名称:

$message->attach($pathToFile, array('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 闭包的 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('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 的服务。