[TOC]
  Laravel 基于 SwiftMailer 库提供了一套干净清爽的邮件API。Laravel为SMTP、Mailgun、Mandrill、Amazon SES、PHP 的mail函数,以及sendmail提供了驱动,从而允许我们快速通过本地或云服务发送邮件。

配置邮件

主要有两个配置文件:
config/mail.php .env,其中.env覆盖mail.php里的值,因此配置.env里的内容就可以了:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qiye.163.com
MAIL_PORT=25
MAIL_USERNAME=账号
MAIL_PASSWORD=密码
MAIL_ENCRYPTION=null

照着上面这样配置。

发邮件

直接先看代码:

public function sendEmailReminder(Request $request, $id)
    {
        $user = User::findOrFail($id);

        Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {
            $m->to($user->email, $user->name)->subject('Your Reminder!');
        });
    }

运行上面的方法,报错:
Swift_TransportException in AbstractSmtpTransport.php line 162:
Cannot send message without a sender address.
这是因为我们需要去修改一下 mail.php 配置文件
打开 config/mail.php 找到 from 配置项

'from' => ['address' => null, 'name' => null],

我们需要配置发件地址(与配置中的MAIL_USERNAME填写一致即可),和显示的昵称,把这两项配置好了就ok啦~

Mail::send()主要有三个参数:

  1. 邮件的视图,这个和其他Blade视图一样,放在resources/views;

  2. 第二个是传进邮件的数据,这个和Controller里传数据到视图是一样的;

  3. 第三个是个闭包,主要是一些邮件设置,主题,收件人,抄送,密送这些;

注意:email的视图有些特殊,$message对象会默认被传入,所以我们自己的数据就不要起$message这个名字。

最后插一句,function ($m) 这个$m就是$message对象;use ($user),如果你的闭包要用外部数据,就要这样写才能传入。

关于邮件的设置

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

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

这个就是例子了。

$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);

attach()里面写文件的完整路径。

高级一点的设置:

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

可以改文件的显示名称和文件的邮件传输类型;

邮件内插入图片

邮件有一些特殊,你直接按照Blade Html的方式插入图片,发送后图片显示是一个叉。
插图片要这样写:

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

记得上面讲过的吗?$message在邮件的视图里是默认的存在。

如果你想在文本中内嵌个word文档,应该可以这样写(尚未验证,哪位验证过麻烦留个言)

<?php echo $message->embed($pathToFile); ?>

有时候我们处理图片或文件,玩的不是文件,而是一堆数字化代码(Raw Data),这个时候可以这样嵌入:

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

同理的,如果你要插入的是正常的附件,那么可以

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

让视图变成无Html的纯文本底版

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

直接发送字符串

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

邮件队列

邮件是典型的使用队列服务的对象之一。发一个有很多附件的邮件,难道要让用户等着发完后才能继续浏览网页吗?显然这里需要异步执行。

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

建议通常情况下都这么写;

队列延迟发送

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

加入指定队列

针对上面讲的2个,还可以指定一个特定的队列:

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

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

邮件的本地调试

  开发的时候要测试邮件,但是你不能总是发垃圾邮件给别人。文档介绍了3种模拟发送的方式,经过测试,只有第二种最简单,最接近真实情况:

找到配置文件config/mail.php:
加上如下配置数组:

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

这样无论我们怎么发,邮件都只会发到这个指定的邮箱上,生产环境把这个代码注释掉就行了。

本文转载自:Laravel 5.1 文档攻略 邮件
参考文档:[ Laravel 5.2 文档 ] 服务 —— 邮件

参考地址


最后编辑: 于 3年前

标签

评论列表(0)

    暂无评论