laravel 基础教程 —— 邮件

邮件

简介

laravel 基于流行的
SwiftMailer
类库营造了一种彻底容易的邮件 API。laravel 提供了驱动以支持SMTP,Mandrill,斯ParkerPost,亚马逊(Amazon) SES,PHP 的 mail 方法和 sendmail
方法,那允许你快捷的开端打造通过当地或云服务发送邮件的功能。

使得先决条件

依照 API 的驱动程序如 Mailgun 和 Mandrill 常常要比 SMTP
服务简单高效。所有的 API 驱动都不大概不引入 Guzzle HTTP 类库,你可以由此在
composer.json 文件中添加上面的始末来拓展设置:

"guzzlehttp/guzzle": "~5.3|~6.0"

Mailgun 驱动

假诺接纳 Mailgun 驱动,你首先要求安装 Guzzle,然后设置 config/mail.php
配置文件的 driver 选项为 mailgun。然后,你须求认同你的
config/services.php 配置文件中包蕴以下选项:

'mailgun' => [
  'domain' => 'your-mailgun-domain',
  'secret' => 'your-mailgun-key',
],

Mandrill 驱动

比方利用 Mandrill 驱动,你首先需求设置 Guzzle,然后设置
config/mail.php 配置文件的 driver 选项为
mandrill。接着,你要求肯定你的 config/services.php
配置文件中带有以下选项:

'mandrill' => [
  'secret' => 'your-mandrill-key',
],

SparkPost 驱动

设若拔取 斯ParkerPost 驱动,你首先须要安装 Guzzle,然后设置你的
config/mail.php 配置文件中的 driver 选项为
sparkpost。接着,你必要认可你的 config/services.php
配置文件中含有以下选项:

'sparkpost' => [
  'secret' => 'your-sparkpost-key',
],

SES 驱动

一旦拔取 亚马逊 SES 驱动,你需求在 PHP 中引入 亚马逊 AWS
SDK。你能够由此在 composer.json 文件中展开引入安装:

"aws/aws-sdk-php": "~3.0"

下一场设置你的 config/mail.php 配置文件的 driver 选项为
ses。接着,你必要承认你的 config/services.php
配置文件中蕴藏以下选项:

'ses' => [
  'key' => 'your-ses-key',
  'secret' => 'your-ses-secret',
  'region' => 'ses-region', //e.g. us-east-1
],

发送邮件

laravel 允许你利用视图来囤积你的邮件音讯。比如,你可以在
resources/views 目录下创办一个 emails 目录来治本你的邮件视图:

你要求动用 Mail 假面的 send 方法来发送一个邮件。send
方法接收五个参数,首个参数应该是视图的称谓。首个参数应该是传递到视图中的数据所结合的数组。最终,是一个
Closure 回调函数,那些回调函数会接收一个 message
实例,那允许你轻易的安插收件人,核心,和其它方面的邮件新闻:

<?php

namespace App\Http\Controller;

use Mail;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
  /**
   * Send an e-mail reminder to the user.
   *
   * @param Request $request
   * @param int $id
   * @return Response
   */
   public function sendEmailReminder(Request $request, $id)
   {
     $user = User::findOrFail($id);

     Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
       $m->from('hello@app.com', 'Your Application');

       $m->to($user->email, $user->name)->subject('Your Reminder!');
     });
   }
}

因为地点的演示中大家传递了 user
键到数组中,所以我们得以在大家的邮件视图中选用用户的名号:

<?php echo $user->name; ?>

注意: 一个 $message
变量会自行的传递到邮件视图,并且同意内联附件。所以,你应该防止手动的传递到视图
messagePHP, 变量。

创设一个 Message

就像是小编辈地点谈到的,传递到 send 方法的第多少个参数是一个
Closure,这几个闭包允许你设置邮件新闻的种种选项。使用闭包,你可以指定音讯的其它性质,比如复写,密抄等:

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

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

那里列出了 $message 营造实例所有可用的艺术:

$message->from($address, $name = null);
$message->sender($address, $name = null);
$message->to($address, $name = null);
$message->cc($address, $name = null);
$message->bcc($address, $name = null);
$message->replyTo($address, $name = null);
$message->subject($subject);
$message->priority($level);
$message->attach($pathToFile, array $options = []);

// Attach a file from a raw $data string...
$message->attachData($data, $name, array $options = []);

// Get the underlying SwiftMailer message instance...
$message->getSwiftMessage();

留神:message 实例继承自 斯维夫特Mailer 音讯类并会被传送到 Mail::send
闭包中。那允许你在做客具有 斯维夫特Mailer 新闻类的点子。

纯文本邮件

默认的,send 方法会借使传递到内部的视图包罗了
HTML。然则,你可以传递一个数组到 send
方法的第四个参数,你指定一个纯文本视图来统一 HTML 视图:

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

要么你可以只传递一个纯文本的邮件,你须求指定数组的键为 text:

Mail::send(['text' => 'view'], $data, $callback);

原始字符串邮件

你能够使用 raw 方法来直接发送原始字符串邮件:

Mail::raw('Text to e-mail', function ($message){
  //
});

附件

您可以运用传递到闭包中的 $message 对象的 attach
方法来在邮件中添加附件。attach
方法接收一个完完全全的文件路径作为第二个参数:

Mail::send('emails.welcome', $data, function ($message) {
  //

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

当您添加一个邮件附件时,你或然也亟需指定附件显示的称谓或然 MIME
type。你可以向 attach 方法传递一个数组作为第一个参数:

$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);

attachData
方法可以用来添加一个原始字节字符串作为一个附件。比如,你恐怕需求采纳这些艺术来将内存中生成的
PDF 直接抬高到附件中,而不需要先存储到磁盘:

$message->attachData($pdf, 'invoice.pdf');

$message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]);

内联附件

在邮件视图中置放一个图纸

在邮件中内联一个图纸常常是比较笨重的。不过,laravel
提供了一种便民的艺术在您的邮件中附加一个图纸并且取回适当的
CID。你须求在邮件视图中拔取 $message 变量的 embed
方法。你应有记得,Laravel 会自动的制造一个 $message
变量并将其传递到您的邮件视图中:

<body>
  Here is an image:

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

放置原始数据到视图

万一你期望嵌入一个原来数据到邮件音信中,你可以动用 $message 变量的
embedData 方法:

<body>
  Here is an image from raw data:

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

邮件队列

队列化邮件新闻

由于发送邮件是尤其消耗资源的一件事,那样会潜移默化到使用的响应时间。所以众多开发者都拔取使用队列来形成异步的邮件发送。Laravel
使用统一的行列接口来使这一个分外不难。你必要使用 Mail 假面的 queue
方法来使邮件队列化:

Mail::queue('emails.welcome', $data, function ($message) {
  // 
});

该方法会自动的在队列添加发送邮件的职分,该职责会在后台自动的举行。当然,你须求先配备好队列。

推迟音讯队列

假使您愿意延迟执行邮件的出殡队列。你要求利用 later
方法。你要求在章程的首先个参数传送一个你希望延迟执行的秒数:

Mail::later(5, 'emails.welcome', $data, function ($message) {
  //
});

添加到指定的行列

借使你希望添加邮件职分到指定的行列,你需求动用 queueOnlaterOn
方法:

Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) {
  // 
});

Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) {
  // 
});

邮件 & 本地开发

当开发一个殡葬邮件的劳动时,你可能并不期待真正的去发送一个邮件。只须求效法测试成功就足以了。laravel
提供了三种格局来剥夺真实的邮件发送。

log 驱动

里面一个缓解方案就是在地面开发时采用 log
邮件驱动。那么些驱动会将所有的邮件音信写入到日志文件中。

通用的邮件

除此以外一个缓解方案就是设置一个通用的邮件来接收所有的利用发出的邮件。那种格局,会使利用生成的持有邮件都发送到这些地点。你可以通过安排
config/mail.php 文件的 to 选项来展开设置:

'to' => [
  'address' => 'dev@domain.com',
  'name' => 'Dev Example'
],

mailtrap

末段,你也得以应用一些像
Mailtrapsmtp
驱动的服务来发送你的邮件到一个虚拟邮箱,而且你也可以透过实际的邮件客户端进行查看。那足以使您看看实际的邮件在
Mailtrap 中的突显效果。

事件

laravel
会在发送邮件从前接触事件。你应该注意的是,它是在邮件发送从前接触事件,而不是充裕到行列时。你可以在
EventServiceProvider 中注册一个事件监听者:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
 protected $listen = [
  'Illuminate\Mail\Events\MessageSending' => [
    'App\Listeners\LogSentMessage',
  ],
 ];

相关文章