Mail in Laravel (P1)

1. Giới thiệu

  • Laravel cung cấp một API đơn giản, clean hơn thư viện SwiftMailer thông thường với các driver: SMTP, Mailgun, SparkPost, Amazon SES, chức năng PHP mail và sendmail cho phép bạn gửi mail nhanh chóng thông qua local hoặc điện toán đám mây tùy vào sự lựa chọn của bạn.

Driver Prerequistes

  • API dựa trên các driver như Mailgun và SparkPost thường đơn giản và nhanh hơn các máy chủ SMTP. Nếu có thể, bạn nên sử dụng một trong các driver đó. Tất cả các API driver yêu cầu thư viện Guzzle HTTP, cái mà bạn có thể cài đặt qua gói Composer bằng câu lệnh như sau:
       composer require guzzlehttp/guzzle
  • Mailgun driver: để sử dụng Mailgun driver, trước tiên bạn cần cài đặt Guzzle, sau đó thiết lập các điều khiển trong config/mail.php cho mailgun. Tiếp theo, thiết lập cho config/services.php như sau:
        'mailgun' => [
            'domain' => 'your-mailgun-domain',
            'secret' => 'your-mailgun-key',
         ],
  • Sparkpost driver: để sử dụng Sparkpost driver, trước tiên bạn cần cài đặt Guzzle, sau đó thiết lập các điều khiển trong config/mail.php cho sparkpost. Tiếp theo, thiết lập cho config/services.php như sau:
       'sparkpost' => [
            'secret' => 'your-sparkpost-key',
        ],
  • SES driver: để sử dụng Amazon SES, đầu tiên bạn phải cài đặt Amazon AWS SDK cho PHP. Bạn có thể cài đặt thư viện này bằng cách thêm các dòng sau trong file composer.json như sau:
      "aws/aws-sdk-php": "~3.0"
và chạy câu lệnh
      composer update
tiếp theo thiết lập ses drive trong file config/mail.php và xác nhận trong file `config/services.php` như sau:
      'ses' => [
            'key' => 'your-ses-key',
            'secret' => 'your-ses-secret',
            'region' => 'ses-region',  // e.g. us-east-1
        ],

2. Generating Mailables

  • Trong Laravel, từng loại email được gửi bởi ứng dụng của bạn được gọi là một lớp “mailable”. Những lớp này được lưu trữ trong thư mục app/Mail. Đừng lo lắng nếu bạn không nhìn thấy thư mục này trong ứng dụng của bạn, vì nó sẽ được tạo ra khi bạn tạo lớp mailable đầu tiên sử dụng câu lệnh:
      php artisan make:mail OrderShipped

3. Writing Mailables

  • Cấu hình của tất cả mailable class được thực hiện trong việc xây dựng method. Trong method này, bạn có thể gọi các method khác nhau như: from, subject, view, và attach để cấu hình sự trình bày của mail và gửi mail.

a.Configuring The Sender

  • Sử dụng method from: đầu tiên chúng ta cần tìm hiểu cấu hình của người gửi mail, hay chính là những người gửi mail từ from. Có hai cách để cấu hình cho người gửi mail.

    • Thứ nhất, bạn có thể sử dụng method from được cấu hình trong method build của class mailable.
        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->from('[email protected]')
                        ->view('emails.orders.shipped');
        }
  • Using A Global from Address
    • Tuy nhiên, nếu ứng dụng của bạn sử dụng cùng một địa chỉ from cho tất cả các email của mình, nó có thể trở nên nặng nề để gọi method from từ class mailable bạn tạo ra. Thay vào đó, bạn có thể sử dụng địa chỉ from toàn cục trong file cấu hình config/mail.php. Địa chỉ này sẽ được sử dụng nếu địa chỉ from không khác địa chỉ được cấu hình trong class mailable
        'from' => ['address' => '[email protected]', 'name' => 'App Name'],

b. Configuring The View

  • Trong việc xây dựng method của class mailable, bạn có thể sử dụng method view để xác định template nên sử dụng khi mà render nội dung của mail. Vì mỗi một email sử dụng một Blade template để hiển thị nội dung của nó, nên bạn có thể xây dựng HTML của email của bạn dựa vào Blade template.
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.orders.shipped');
    }
  • Plain Text Emails

    Nếu bạn muốn định nghĩa một văn bản thuần túy trong email của bạn, bạn có thể sử dụng method text. Giống như method view, method text cho phép một template mẫu cái mà sử dụng để hiển thị nội dung của email. Bạn được tự do định nghĩa cả HTML và văn bản thuần túy trong tin nhắn của bạn.

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.orders.shipped')
                    ->text('emails.orders.shipped_plain');
    }

c. View Data

  • Via Public Properties

    Thông thường, bạn muốn vượt qua một số dữ liệu để xem trước view của bạn, có hai cách để tạo dữ liệu có sẵn để xem view của bạn. Đầu tiên, bất kỳ thuộc tính nào được định nghĩa trong class mailable của bạn có thể tự động tạo sẵn view để xem. Ví dụ bạn có thể truyền dữ liệu vào class mailable, và thiết lập dữ liệu để các thuộc tính công khai được định nghĩa trong class:

    <?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;

        /**
         * The order instance.
         *
         * @var Order
         */
        public $order;

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

        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('emails.orders.shipped');
        }
    }
Một khi dữ liệu được thiết lập, nó sẽ tự động view cho bạn vì vậy bạn có thể truy cập vào bất kỳ dữ liệu nào khác trong Blade templates:
    <div>
        Price: {{ $order->price }}
    </div>
  • Via The with Method: Nếu bạn muốn tùy chỉnh định dạng của dữ liệu email của bạn trước khi gửi, bạn có thể truyền dữ liệu để xem thông qua method 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;

        /**
         * The order instance.
         *
         * @var Order
         */
        protected $order;

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

        /**
         * Build the message.
         *
         * @return $this
         */
        public function build()
        {
            return $this->view('emails.orders.shipped')
                        ->with([
                            'orderName' => $this->order->name,
                            'orderPrice' => $this->order->price,
                        ]);
        }
    }
Một khi dữ liệu được thiết lập, nó sẽ tự động view cho bạn vì vậy bạn có thể truy cập vào bất kỳ dữ liệu nào khác trong Blade templates:
    <div>
        Price: {{ $orderPrice }}
    </div>

Tài liệu tham khảo: https://laravel.com/docs/5.3/mail


All Rights Reserved