环境
基于 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,其他要么付费要么不能用。
第一步 laravel 邮箱配置
hotmail 获取邮箱授权码 Gmail获取邮箱授权码
laravel只需要配置.env即可。
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=你的Gmail邮箱地址
MAIL_PASSWORD=你的Gmail邮箱地址对应的授权密码(不是登录密码)
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS="你的Gmail邮箱地址 |这项需要和MAIL_USERNAME一模一样"
MAIL_FROM_NAME="发件人名称"
Notice: MAIL_ENCRYPTION可以根据需要修改,但是如果不使用ssl,也需要修改MAIL_PORT为25端口
生成 Mailable 对象
在 Laravel 中,每种类型的邮件都代表一个「Mailable」对象。这些对象存储在 app/Mail
目录中。如果在你的应用中没有看见这个目录,别担心,在首次使用 make:mail
命令创建 Mailable 类时这个目录会被创建,例如:
php artisan make:mail OrderShipped
编写 Mailable
使用 from 方法
首先,演示配置邮件的发送者,也就是邮件的参数 「from」,既谁发送了邮件。有两种方法配置发送者。第一种是你可以在 build
方法中使用 from
方法:
form方法一定要填写第二个参数,不然会报错 Swift_TransportException: Expected response code 250 but got code "501", with message "501
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com这里填邮箱','这里添写发送人名称,不然会报错的')
->view('emails.orders.shipped');
}
配置视图
在 build
方法内,你可以使用 view
方法指定邮件的模板,以渲染邮件的内容。因为所有邮件都会使用 Blade 模板 渲染内容,你能很容易的使用 Blade 模板引擎构建邮件的 HTML:
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped');
}
{tip} 你可以创建一个 resources/views/emails 目录来存放所有的邮件模板;然而,这不是强制要求,你可以在有的将邮件模板放在 resources/views 目录的任意位置。
通过 subject 方法设置邮件主题
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->subject('xxx'); // 邮件主题
}
通过 with 方法向模板传参:
你可以使用 with
方法来传递数据给模板。一般情况下,你仍然是使用 Mailable 类的构造函数来接受数据传参。然而你需要为这些数据属性设置 protected
或 private
声明,否则这些数据会被自动加载到模板中。接下来你可以使用 with
方法接受键值数组传参来传递数据给模板,就如控制器里为视图传参一样:
<?php
namespace AppMail;
use AppOrder;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateQueueSerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
/**
* order 实例。
*
* @var Order
*/
protected $order;
/**
* 创建一个新消息实例。
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* 构建消息。
*
* @return $this
*/
public function build()
{
return $this->view('emails.orders.shipped')
->with([
'orderName' => $this->order->name,
'orderPrice' => $this->order->price,
]);
}
}
一旦数据已经用 with
方法传递,它们将自动在视图中加载,所以你可以访问像访问其他 Blade 模板数据一样访问它们:
<div>
Price: {{ $orderPrice }}
</div>
发送邮件
要发送邮件,使用 Mail
facade 的 to
方法。 to
方法接受一个邮件地址,一个 user 实现或一个 users 集合。如果传递一个对象或集合,mailer 将自动使用 email
和 name
属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 Mailable 类的 send
方法:
<?php
namespace AppHttpControllers;
use AppOrder;
use AppMailOrderShipped;
use IlluminateHttpRequest;
use IlluminateSupportFacadesMail;
use AppHttpControllersController;
class OrderController extends Controller
{
/**
* Ship the given order.
*
* @param Request $request
* @param int $orderId
* @return Response
*/
public function ship(Request $request, $orderId)
{
$order = Order::findOrFail($orderId);
// Ship order...
Mail::to($request->user())->send(new OrderShipped($order));
}
/**
* 这个是我的改造的demo
* 发送邮件
*/
public function sendEmail(Request $request)
{
$email = $request->input('email');
$verify_code = $request->input('verify_code');
$return = ['code' => 0, 'msg' => '成功'];
$email_preg = '/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|-]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/';
if (!preg_match($email_preg, $email)) {
return ['code' => 1, 'msg' => '邮箱格式错误'];
}
$code_preg = '/^[0-9]{6}$/';
if (!preg_match($code_preg, $verify_code)) {
return ['code' => 2, 'msg' => '验证码格式错误'];
}
try {
Mail::to($email)->send(new Email($verify_code));
} catch (Error $error) {
$return = ['code' => 4, 'msg' => '邮件发送失败'];
}
return $return;
}
}