Laravel框架的邮件发送

基于环境

laravel版本:7.0+
基于 Laravel Framework 5.5.45,使用自带的SMTP协议提供驱动。

Laravel支持多种邮件驱动方式,包括smtpMailgunMaildrillAmazon SESmailsendmailMailgunAmazon SES都是收费的,Maildrill目前不支持中国区用户,这三个都是第三方邮件服务。mail驱动使用PHP提供的mail函数发送,sendmail驱动通过Sendmail/Postfix(Linux)提供的命令发送邮件,smtp驱动通过支持ESMTPSMTP发送邮件。

就目前状况来看,使用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 方法中完成,在这个方法中,你可以调用多个方法,例如 fromsubjectview, 和 attach 来配置邮件的内容和发送

  • 使用 from 方法

    两个参数:第一个参数为要发送人的邮箱,第二个参数为要发送人的名称,如图(图1):
    图1:

    Laravel框架的邮件发送

  • 使用 subject 方法

    设置发送邮件的主题,详细使用请参考上图(图1)

配置视图


可以在可邮寄类的 build 方法中使用 view 方法来指定渲染邮件内容时使用哪个视图模板,由于每封邮件通常使用 Blade 模板来渲染内容,所以你可以在构建邮件 HTML 时使用 Blade 模板引擎提供的所有功能,详细使用请参考上图(图1)

可以创建一个 resources/views/emails 目录来存放所有邮件模板,当然,你也可以将邮件模板放到 resources/views 目录下任意其它位置。我们这里是在resources/views/emails 目录下创建了testBlade模板文件,如下图:

Laravel框架的邮件发送

<!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作为公共属性,如下图:

    Laravel框架的邮件发送

发送邮件

要发送邮件,使用 Mail facadeto 方法。 to 方法接受一个邮件地址,一个 user 实现或一个 users 集合。如果传递一个对象或集合,mailer 将自动使用 emailname 属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 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框架的邮件发送

邮件队列

  • 将邮件消息加入队列

    由于发送邮件消息可能大幅度延长应用的响应时间,许多开发者选择将邮件消息加入队列放在后台发送。Laravel 使用内置的 统一队列 API 简化了这一工作。若要将邮件消息加入队列,可以在指定消息的接收者后,使用 Mail facadequeue 方法

    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 协议》,转载必须注明作者和本文链接
EMin
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!