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 App\Mail;

use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

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 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
{
    /**
     * 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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM