Laravel框架的邮件发送
基于环境
laravel版本:7.0+
基于 Laravel Framework 5.5.45,使用自带的SMTP协议提供驱动。
Laravel支持多种邮件驱动方式,包括smtp
、Mailgun
、Maildrill
、Amazon SES
、mail
和sendmail
,Mailgun
和Amazon SES
都是收费的,Maildrill
目前不支持中国区用户,这三个都是第三方邮件服务。mail
驱动使用PHP提供的mail函数发送,sendmail
驱动通过Sendmail/Postfix
(Linux)提供的命令发送邮件,smtp
驱动通过支持ESMTP
的SMTP
发送邮件。
就目前状况来看,使用smtp
是最明智的选择,mail
不安全,sendmail
需要安装配置Sendmail/Postfix
,其他要么付费要么不能用。
邮箱配置
- 进入
config/mail.php
文件修改对应的参数配置 - 或进入
.env
文件修改MAIL_
开头的几个参数值MAIL_DRIVER=smtp MAIL_HOST= smtp.qiye.163.com MAIL_PORT= 端口号 // 25 MAIL_USERNAME= 邮箱地址 //xxx.com MAIL_PASSWORD= 邮箱地址对应的授权密码(不是登录密码) MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=邮箱地址,这项需要和MAIL_USERNAME一模一样 MAIL_FROM_NAME=发件人名称
ps:MAIL_ENCRYPTION可以根据需要修改,但是如果不使用ssl,也需要修改MAIL_PORT为25端口
生成可邮寄类
输入指令php artisan make:mail OrderShipped
会在app/Mail
下生成一个邮寄类OrderShipped
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
public $data;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$title = "来自".$this->data['user_name'].'的留言';
return $this->from('xxx.com','xxx名称')
->subject($title)
->view('emails.test');
}
}
编写可邮寄类
所有的可邮寄类配置都在
build
方法中完成,在这个方法中,你可以调用多个方法,例如from
,subject
,view
, 和attach
来配置邮件的内容和发送
配置视图
可以在可邮寄类的 build
方法中使用 view
方法来指定渲染邮件内容时使用哪个视图模板,由于每封邮件通常使用 Blade
模板来渲染内容,所以你可以在构建邮件 HTML
时使用 Blade
模板引擎提供的所有功能,详细使用请参考上图(图1)
可以创建一个
resources/views/emails
目录来存放所有邮件模板,当然,你也可以将邮件模板放到resources/views
目录下任意其它位置。我们这里是在resources/views/emails
目录下创建了test
的Blade
模板文件,如下图:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户的邮箱:{{$data['user_email']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户的名字:{{$data['user_name']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户的手机:{{$data['phone']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户的公司:{{$data['m_company']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户的城市:{{$data['city']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言用户公司的网址:{{$data['m_address']}}</div>
<div style='border-bottom: 1px solid #eee;margin: 10px 0;'>留言的内容:{{$data['m_content']}}</div>
</body>
</html>
视图数据
通过公共属性传参
通常,我们需要传递一些数据到渲染邮件的
HTML
视图以供使用。有两种方式将数据传递到视图,首先,您的mailable
类中定义的任何公共属性将自动传递给视图。 因此,您可以将数据传递到mailable
类的构造函数,并将该数据设置为类的公共属性,我们这里使用的是$data
作为公共属性,如下图:
发送邮件
要发送邮件,使用 Mail facade
的 to
方法。 to
方法接受一个邮件地址,一个 user
实现或一个 users
集合。如果传递一个对象或集合,mailer
将自动使用 email
和 name
属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 Mailable
类的 send
方法,如下图:
<?php
namespace App\Http\Controllers;
use App\Order;
use App\Mail\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;
class OrderController extends Controller
{
/**
* 发送给定的订单。
*
* @param Request $request
* @param int $orderId
* @return Response
*/
public function ship(Request $request, $orderId)
{
$order = Order::findOrFail($orderId);
// 发送订单...
// to方法也可只传一个要发送的邮箱
Mail::to($request->user())->send(new OrderShipped($order));
}
}
邮件队列
将邮件消息加入队列
由于发送邮件消息可能大幅度延长应用的响应时间,许多开发者选择将邮件消息加入队列放在后台发送。
Laravel
使用内置的 统一队列API
简化了这一工作。若要将邮件消息加入队列,可以在指定消息的接收者后,使用Mail facade
的queue
方法Mail::to('emin@lenkeng.com') ->cc($moreUsers) ->bcc($evenMoreUsers) ->queue(new OrderShipped($order));
此方法自动将作业推送到队列中以便消息在后台发送。使用此特性之前,需要
配置队列
(如何配置消息队列,请参考博主的另一篇文章《laravel框架的消息队列》)延迟消息队列
想要延迟发送队列化的邮件消息,可以使用
later
方法。later
方法的第一个参数的第一个参数是标示消息何时发送的DateTime
实例:// 代表延迟10分钟后发送 $when = now()->addMinutes(10); Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->later($when, new OrderShipped($order));
特别感谢
参考博客地址:
本作品采用《CC 协议》,转载必须注明作者和本文链接
优秀