怎麼在 Laravel 中, 利用 AWS SES 發郵件?

  1. 申請 AWS SES(simple Email Service) 服務
  2. 建立一個使用者, 並建立政策 (SES full access), 取得 Access key 跟 Secret key
  3. 到 AWS SES 主控台, 左方 Email Addresses, 然後進去點選 verify a new email address 進行驗證

  1. Google AWS support center, 提交‘移出沙盒’申請, 約24小時內會解封。否則寄信數量跟頻率都會被很大程度上限制住, 且任何收件人都必須要經過AWS驗證。

  2. 開立一個 Laravel 專案

  3. 輸入 composer require guzzlehttp/guzzle, 安裝套件
  4. 安裝AWS SDK composer require aws/aws-sdk-php
  5. config/mail.php 中, 將 driver 選項相對的 env 參數改成 ses
  6. config/services.php 中, 進行以下配置

    'ses' => [
    'key' => 'your-ses-key',
    'secret' => 'your-ses-secret',
    'region' => 'ses-region', // e.g. us-east-1
    ],
  7. 以上參數在 env 的配置, 大概如下:

    MAIL_DRIVER=ses
    MAIL_FROM_ADDRESS=your-mail-address
    MAIL_FROM_NAME=BuyBuyGo
    SES_KEY=your-ses-key
    SES_SECRET=your-ses-secret
    SES_REGION=us-west-2
  8. 建立 Maiiables class, php artisan make:mail OrderCreated --markdown=emails.orders.created

  9. OrderCreated 中, 建立 build 檔案, 大略如下:

    <?php

    namespace App\Mail;

    use Illuminate\Bus\Queueable;
    use Illuminate\Mail\Mailable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Contracts\Queue\ShouldQueue;

    class OrderShipped extends Mailable
    {
    use Queueable, SerializesModels;

    protected $order;

    /**
    * Create a new message instance.
    *
    * @return void
    */
    public function __construct($order)
    {
    $this->order = $order;
    //
    }

    /**
    * Build the message.
    *
    * @return $this
    */
    public function build()
    {
    return $this->markdown('emails.orders.created')
    ->with([
    'buyer' => $this->order->user->name,
    'order' => $this->order->name,
    'item_name' => $this->order->item_name,
    'item_description' => $this->order->item_description,
    'quantity' => $this->order->quantity,
    'total_amount' => $this->order->total_amount,
    'unit_price' => $this->order->unit_price,
    'expiry_time' => $this->order->expiry_time,
    ]);
    }
    }
  10. created.blade 當中做版面客制, 大略如下:

    @component('mail::message')
    # Dear {{ $buyer }}
    Thanks for your patronage!

    - Order: {{$order}}
    - Item: {{$item_name}}
    - Item description: {{$item_description}}
    - Quantity: {{$quantity}}
    - Unit price: {{$unit_price}}
    - Amount: {{$total_amount}}

    ## Kindly make this payment before <span style="color: red">{{$expiry_time}}</span>

    <hr>

    <br>
    ## If you have any question, feel free to contact us

    @component('mail::button', ['url' => 'https://tn710617.github.io/'])
    Contact Us
    @endcomponent

    Thanks,<br>
    {{ config('app.name') }}
    @endcomponent
  11. 在任何你想要發這封mail的地方, 使用 mail 來寄信, 大略如下:

    Mail::to($buyer->email)->send(new OrderCreated($order));
  12. 至此, 應該可以成功寄信了!

  13. 你以為結束了嗎? 呵呵, 是快結束了啦! 不過呢, 還有一件事情非常重要!
    上面的部分大概花了我一天, 然後我遇到一個未解的謎題, 又被搞了一天。
    身為一個 backend programmer, 如果遇到需要接金流的話, 我都是用 ngrok 來測試。
    這次遇到的問題很奇怪, 當我收到金流服務商的回饋時, 我必須要去做一些事, 自 controller 收到 request 之後所做的任何 function 都沒有問題, 資料庫的 CRUD 也都正常, 可偏偏只要執行到這一行寄 mail 的, 就給我報錯!! 錯誤訊息如下:

    "message": "Expected response code 250 but got code \"530\", with message \"530 5.7.1 Authentication required\r\n\"",
    "exception": "Swift_TransportException",
    "file": "/Users/ray/code/FacebookOptimizedSellingSystem/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php",
    "line": 457,
    "trace": [

以下省略一千行…

在經過超級無敵疲勞的 Debug 之後, 終於發現問題…

只要使用 valet share, 就不會有這個問題
只要是用 php artisan serve --port=yourPort, 然後 ngrok http yourPort, 這樣就會遇到我說的這個問題。

雖然最後問題解決了, 但說實在的我還是不知道為什麼…

如果有大大知道這是什麼原因, 還請麻煩來信幫我解惑一下!感激不盡!

使用 Laravel 任務排程 如何設置Git的個人資訊?

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×