laravel框架的邮件发送 | laravel china 社区-金年会app官方网
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
来配置邮件的内容和发送
使用 from 方法
两个参数:第一个参数为要发送人的邮箱,第二个参数为要发送人的名称,如图(图1):
图1:
使用 subject 方法
设置发送邮件的主题,详细使用请参考上图(图1)
配置视图
可以在可邮寄类的 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('[email protected]') ->cc($moreusers) ->bcc($evenmoreusers) ->queue(new ordershipped($order));
此方法自动将作业推送到队列中以便消息在后台发送。使用此特性之前,需要
配置队列
(如何配置消息队列,请参考博主的另一篇文章《》)延迟消息队列
想要延迟发送队列化的邮件消息,可以使用
later
方法。later
方法的第一个参数的第一个参数是标示消息何时发送的datetime
实例:// 代表延迟10分钟后发送 $when = now()->addminutes(10); mail::to($request->user()) ->cc($moreusers) ->bcc($evenmoreusers) ->later($when, new ordershipped($order));
参考博客地址:
本作品采用《cc 协议》,转载必须注明作者和本文链接
推荐文章: