Laravel——郵件發送

安裝

全部的 API 驅動要求應用已經安裝 Guzzle HTTP 庫,你能夠經過 Composer 包管理器來安裝它:php

composer require guzzlehttp/guzzle
複製代碼

配置

.envredis

MAIL_DRIVER=smtp
MAIL_PORT=465
MAIL_HOST=smtp.qq.com
MAIL_USERNAME=qq郵箱
MAIL_PASSWORD=不是登錄密碼,是POP3/SMTP碼
MAIL_FROM=
MAIL_ENCRYPTION=ssl
複製代碼

生成可郵寄類

在 Laravel 中,應用發送的每一封郵件均可以表示爲 「可郵寄」 類,這些類都存放在 app/Mail 目錄。若是沒看到這個目錄,別擔憂,它將會在你使用 make:mail 命令建立第一個可郵寄類時生成:數組

php artisan make:mail OrderShipped
複製代碼

配置發件人

public function build()
{
    return $this->from('example@example.com')
                ->view('emails.orders.shipped');
}
複製代碼

配置視圖

你能夠建立一個 resources/views/emails 目錄來存放全部郵件模板bash

public function build()
{
    return $this->view('emails.orders.shipped');
}
複製代碼

視圖數據

經過公共屬性app

一般,咱們須要傳遞一些數據到渲染郵件的 HTML 視圖以供使用。有兩種方式將數據傳遞到視圖,首先,您的 mailable 類中定義的任何公共屬性將自動傳遞給視圖。 所以,您能夠將數據傳遞到 mailable 類的構造函數,並將該數據設置爲類的公共屬性composer

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * 訂單實例.
     *
     * @var Order
     */
    public $order;

    /**
     * 建立一個新的消息實例.
     *
     * @return void
     */
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * 構建消息.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.orders.shipped');
    }
}
複製代碼

數據被設置給公共屬性後,將會在視圖中自動生效,因此你能夠像在 Blade 模板中訪問其它數據同樣訪問它們:函數

<div>
    Price: {{ $order->price }}
</div>
複製代碼

經過 with 方法ui

若是你想要在數據發送到模板以前自定義郵件數據的格式,能夠經過 with 方法手動傳遞數據到視圖。通常狀況下,你仍是須要經過可郵寄類的構造器傳遞數據,不過,此次你須要設置數據爲 protected 或 private 屬性,這樣,這些數據就不會在視圖中自動生效。而後,當調用 with 方法時,傳遞數組數據到該方法以便數據在視圖模板中生效:this

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * 訂單實例.
     *
     * @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 模板訪問其它數據同樣訪問傳遞過來的數據:spa

<div>
    Price: {{ $orderPrice }}
</div>
複製代碼

發送郵件

若要發送郵件,使用 Mail facade 的 to 方法。 to 方法接受 郵件地址、用戶實例或用戶集合。若是傳遞一個對象護着對象集合,mailer 在設置收件人時將自動使用它們的 email 和 name 屬性,所以請確保對象的這些屬性可用。一旦制定了收件人,就能夠將 mailable 類實例傳遞給 send 方法:

class OrderController extends Controller
{
    /**
     * 發送給定的訂單。
     *
     * @param  Request  $request
     * @param  int  $orderId
     * @return Response
     */
    public function ship(Request $request, $orderId)
    {
        $order = Order::findOrFail($orderId);

        // 發送訂單...

        Mail::to($request->user())->send(new OrderShipped($order));
    }
}
複製代碼

再發送消息時不止能夠指定收件人。還能夠經過鏈式調用「to」、「cc」、「bcc」一次性指定抄送和密送收件人:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->send(new OrderShipped($order));
複製代碼

使用隊列

默認隊列

若是一個 mailable 類終是要隊列化,能夠在此類上實現 ShouldQueue 契約。這樣一來,即便你在發送時調用了 send 方法, mailable 也將被序列化:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    //
}
複製代碼

修改配置信息,隊列存儲爲redis

.env

QUEUE_CONNECTION=redis
複製代碼

修改redis配置

config/database.php

'redis' => [
        ...
        'mail' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_CACHE_DB', 2),
        ],

    ],
複製代碼

修改隊列的配置

config/queue.php

'redis' => [
            'driver' => 'redis',
            'connection' => 'mail',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
        ],
複製代碼

配置錯誤嘗試次數或者超時時間

Mail/NoticeMail

public $tries = 20; //嘗試次數
public $timeout = 120;//超時時間
複製代碼

隊列執行成功

隊列執行成功,會從reids裏刪除

隊列執行失敗

須要根據文檔,遷移失敗的表,執行失敗以後,會存到表中。

若是設置,超時時間和嘗試次數,達到失敗條件以後會從redis中刪除,不然,失敗隊列會繼續在redis中,每次啓動都會繼續執行

處理失敗的方法

public function failed(\Exception $exception)
{

}
複製代碼
相關文章
相關標籤/搜索