laravel发送邮件

环境

基于 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 类的构造函数来接受数据传参。然而你需要为这些数据属性设置 protectedprivate 声明,否则这些数据会被自动加载到模板中。接下来你可以使用 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 将自动使用 emailname 属性来设置邮件收件人,所以确保你的对象里有这些属性。一旦指定收件人,你可以传递一个实现到 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;
    }
}
原文地址:https://www.cnblogs.com/niuben/p/13626519.html