Laravel: Mail


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Giới thiệu

Gửi email không cần phải phức tạp. Laravel cung cấp một API email đơn giản, sạch sẽ được hỗ trợ bởi thư viện phổ biến là SwiftMailer. Laravel và SwiftMailer cung cấp trình điều khiển để gửi email qua SMTP, Mailgun, Postmark, Amazon SES và sendmail cho phép bạn nhanh chóng bắt đầu gửi thư thông qua dịch vụ cục bộ hoặc dựa trên đám mây mà bạn chọn.

Cấu hình

Các dịch vụ email của Laravel có thể được định cấu hình thông qua file cấu hình config/mail.php. Mỗi mail được định cấu hình trong tệp này có thể có cấu hình riêng và thậm chí là "phương tiện" duy nhất của riêng nó, cho phép ứng dụng của bạn sử dụng các dịch vụ email khác nhau để gửi một số thông báo email nhất định. Ví dụ: ứng dụng của bạn có thể sử dụng Dấu bưu điện (Postmark) để gửi email giao dịch trong khi sử dụng Amazon SES để gửi email hàng loạt.

Trong file cấu hình mail, bạn sẽ tìm thấy một mảng cấu hình mailers. Mảng này chứa một mục nhập cấu hình mẫu cho từng trình điều khiển/vận chuyển (drivers/transports) thư chính được Laravel hỗ trợ, trong khi giá trị cấu hình default xác định thư nào sẽ được sử dụng theo mặc định khi ứng dụng của bạn cần gửi thư email.

Điều kiện tiên quyết về Driver/Transport

Các trình điều khiển dựa trên API như Mailgun và Postmark thường đơn giản và nhanh hơn so với gửi thư qua máy chủ SMTP. Bất cứ khi nào có thể, V1Study khuyên bạn nên sử dụng một trong những trình điều khiển này. Tất cả các trình điều khiển dựa trên API đều yêu cầu thư viện Guzzle HTTP, có thể được cài đặt thông qua trình quản lý gói Composer:

composer require guzzlehttp/guzzle

Trình điều khiển Mailgun

Để sử dụng trình điều khiển Mailgun, trước tiên hãy cài đặt thư viện Guzzle HTTP. Sau đó, đặt tùy chọn default trong file cấu hình config/mail.php của bạn thành mailgun. Tiếp theo, xác minh rằng file cấu hình config/services.php của bạn chứa các tùy chọn sau:

'mailgun' => [
    'domain' => env('MAILGUN_DOMAIN'),
    'secret' => env('MAILGUN_SECRET'),
],

Nếu bạn không sử dụng vùng Mailgun của Hoa Kỳ, bạn có thể xác định điểm cuối của vùng của mình trong file cấu hình services:

'mailgun' => [
    'domain' => env('MAILGUN_DOMAIN'),
    'secret' => env('MAILGUN_SECRET'),
    'endpoint' => env('MAILGUN_ENDPOINT', 'api.eu.mailgun.net'),
],

Trình điều khiển Postmark

Để sử dụng trình điều khiển Postmark, hãy cài đặt truyền tải SwiftMailer của Postmark qua Composer:

composer require wildbit/swiftmailer-postmark

Tiếp theo, cài đặt thư viện Guzzle HTTP và đặt tùy chọn default trong file cấu hình config/mail.php của bạn thành postmark. Cuối cùng, xác minh rằng file cấu hình config/services.php của bạn chứa các tùy chọn sau:

'postmark' => [
    'token' => env('POSTMARK_TOKEN'),
],

Nếu bạn muốn chỉ định luồng thư Postmark sẽ được sử dụng bởi một bưu phẩm nhất định, bạn có thể thêm tùy chọn cấu hình message_stream_id vào mảng cấu hình của mail. Bạn có thể tìm thấy mảng cấu hình này trong config/mail.php:

'postmark' => [
    'transport' => 'postmark',
    'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
],

Bằng cách này, bạn cũng có thể thiết lập nhiều bưu phẩm Postmark với các luồng thư khác nhau.

Trình điều khiển SES

Để sử dụng trình điều khiển Amazon SES, trước 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 thông qua trình quản lý gói Composer:

composer require aws/aws-sdk-php

Tiếp theo, đặt tùy chọn default trong config/mail.php thành ses và xác minh rằng config/services.php chứa các tùy chọn sau:

'ses' => [
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],

Nếu bạn muốn xác định các tùy chọn bổ sung mà Laravel sẽ chuyển cho phương thức SendRawEmail của AWS SDK khi gửi email, bạn có thể xác định một mảng options trong cấu hình ses:

'ses' => [
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    'options' => [
        'ConfigurationSetName' => 'MyConfigurationSet',
        'Tags' => [
            ['Name' => 'foo', 'Value' => 'bar'],
        ],
    ],
],

Tạo Mailable

Khi xây dựng các ứng dụng Laravel, mỗi loại email được gửi bởi ứng dụng của bạn được biểu thị dưới dạng một lớp "mailable". Các lớp này được lưu trữ trong thư mục app/Mail. Đừng lo lắng nếu bạn không thấy thư mục này trong ứng dụng của mình, vì nó sẽ được tạo cho bạn khi bạn tạo lớp có thể gửi thư đầu tiên của mình bằng lệnh Artisan make:mail:

php artisan make:mail OrderShipped

Viết Mailable

Khi bạn đã tạo một lớp có thể gửi thư, hãy mở nó ra để chúng ta có thể khám phá nội dung của nó. Đầu tiên, hãy lưu ý rằng tất cả cấu hình của một lớp có thể gửi thư được thực hiện trong phương thức build. Trong phương pháp này, bạn có thể gọi các phương thức khác nhau như fromsubjectview, và attach để cấu hình trình bày của email và chuyển.

Định cấu hình Người gửi

Sử dụng phương thức from

Đầu tiên, hãy khám phá cấu hình người gửi email. Hay nói cách khác, email sẽ được gửi "từ" ai. Có hai cách để định cấu hình người gửi. Đầu tiên, bạn có thể sử dụng phương thức from trong phương thức build của lớp Mailable:

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

Sử dụng địa chỉ chung from

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 nó, thì việc gọi phương thức from trong mỗi lớp có thể gửi thư mà bạn tạo có thể trở nên phức tạp. Thay vào đó, bạn có thể chỉ định địa chỉ chung (global) trong file cấu hình config/mail.php. Địa chỉ này sẽ được sử dụng nếu không có địa chỉ "from" nào khác được chỉ định trong lớp Mailable:

'from' => ['address' => 'example@example.com', 'name' => 'App Name'],

Ngoài ra, bạn có thể xác định địa chỉ "reply_to" chung trong config/mail.php:

'reply_to' => ['address' => 'example@example.com', 'name' => 'App Name'],

Định cấu hình Chế độ xem

Trong phương thức build của Mailable, bạn có thể sử dụng phương thức view để chỉ định mẫu nào nên được sử dụng khi hiển thị nội dung của email. Vì mỗi email thường sử dụng mẫu Blade để hiển thị nội dung của nó, bạn có đầy đủ sức mạnh và sự tiện lợi của công cụ tạo khuôn mẫu Blade khi xây dựng HTML cho email của mình:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->view('emails.orders.shipped');
}
Bạn có thể muốn tạo một thư mục resources/views/emails để chứa tất cả các mẫu email của mình; tuy nhiên, bạn có thể tự do đặt chúng ở bất cứ đâu bạn muốn trong resources/views.

Email dạng văn bản thuần túy (Plain Text)

Nếu bạn muốn xác định phiên bản văn bản thuần túy của email, bạn có thể sử dụng phương thức text. Giống như phương thức view, phương thức text chấp nhận một tên mẫu sẽ được sử dụng để hiển thị nội dung của email. Bạn có thể tự do xác định cả phiên bản HTML và văn bản thuần túy của thư của mình:

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

Xem dữ liệu

Thông qua thuộc tính public

Thông thường, bạn sẽ muốn truyền một số dữ liệu sang dạng xem của mình mà bạn có thể sử dụng khi hiển thị HTML của email. Có hai cách bạn có thể cung cấp dữ liệu cho chế độ xem của mình. Đầu tiên, bất kỳ thuộc tính public nào được xác định trên lớp có thể gửi thư của bạn sẽ tự động được cung cấp cho chế độ xem. Vì vậy, ví dụ: bạn có thể truyền dữ liệu vào phương thức khởi tạo của lớp có thể gửi thư và đặt dữ liệu đó thành các thuộc tính public được xác định trên lớp:

<?php

namespace App\Mail;

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

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

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

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

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

Khi dữ liệu đã được đặt thành thuộc tính công khai, nó sẽ tự động có sẵn trong chế độ xem của bạn, vì vậy bạn có thể truy cập nó giống như bạn truy cập vào bất kỳ dữ liệu nào khác trong các mẫu Blade của mình:

<div>
    Price: {{ $order->price }}
</div>

Thông qua phương thức with:

Nếu bạn muốn tùy chỉnh định dạng của dữ liệu email của mình trước khi nó được gửi đến mẫu, bạn có thể truyền dữ liệu của mình sang dạng xem theo phương thức with theo cách thủ công. Thông thường, bạn vẫn sẽ truyền dữ liệu qua phương thức khởi tạo của lớp Mailable; tuy nhiên, bạn nên đặt dữ liệu này thành các thuộc tính protected hoặc private để dữ liệu không được cung cấp tự động cho mẫu. Sau đó, khi gọi phương thức with, hãy truyền một mảng dữ liệu mà bạn muốn cung cấp cho mẫu:

<?php

namespace App\Mail;

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

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

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

    /**
     * Create a new message instance.
     *
     * @param  \App\Models\Order  $order
     * @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,
                    ]);
    }
}

Khi dữ liệu đã được chuyển đến phương thức with, nó sẽ tự động có sẵn trong chế độ xem của bạn, vì vậy bạn có thể truy cập nó giống như truy cập vào bất kỳ dữ liệu nào khác trong các mẫu Blade của bạn:

<div>
    Price: {{ $orderPrice }}
</div>

Tệp đính kèm

Để thêm tệp đính kèm vào email, hãy sử dụng phương thức attach trong phương thức build của lớp Mailable. Phương thức attach chấp nhận đường dẫn đầy đủ đến tập tin như là đối số đầu tiên của mình:

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

Khi đính kèm tệp vào thư, bạn cũng có thể chỉ định tên hiển thị và/hoặc kiểu MIME bằng cách chuyển array làm đối số thứ hai cho phương thức attach:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->view('emails.orders.shipped')
                ->attach('/path/to/file', [
                    'as' => 'name.pdf',
                    'mime' => 'application/pdf',
                ]);
}

Đính kèm tệp từ đĩa

Nếu bạn đã lưu trữ một tệp trên một trong các đĩa hệ thống tệp của mình, bạn có thể đính kèm tệp đó vào email bằng phương thức attachFromStorage:

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

Nếu cần, bạn có thể chỉ định tên tệp đính kèm và các tùy chọn bổ sung bằng cách sử dụng đối số thứ hai và thứ ba cho phương thức attachFromStorage:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
   return $this->view('emails.orders.shipped')
               ->attachFromStorage('/path/to/file', 'name.pdf', [
                   'mime' => 'application/pdf'
               ]);
}

Phương thức attachFromStorageDisk có thể được sử dụng nếu bạn cần phải xác định một đĩa lưu trữ khác ngoài đĩa mặc định của bạn:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
   return $this->view('emails.orders.shipped')
               ->attachFromStorageDisk('s3', '/path/to/file');
}

Tệp đính kèm dữ liệu thô

Phương thức attachData có thể được sử dụng để đính kèm một chuỗi nguyên byte như một tập tin đính kèm. Ví dụ: bạn có thể sử dụng phương thức này nếu bạn đã tạo một tệp PDF trong bộ nhớ và muốn đính kèm nó vào email mà không cần ghi nó vào đĩa. Phương thức attachData chấp nhận các dữ liệu thô byte như là đối số đầu tiên của mình, tên của tập tin như là đối số thứ hai của mình, và một loạt các tùy chọn như là đối số thứ ba của nó:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->view('emails.orders.shipped')
                ->attachData($this->pdf, 'name.pdf', [
                    'mime' => 'application/pdf',
                ]);
}

Tệp đính kèm nội tuyến

Nhúng hình ảnh nội tuyến vào email của bạn thường cồng kềnh; tuy nhiên, Laravel cung cấp một cách thuận tiện để đính kèm hình ảnh vào email của bạn. Để nhúng hình ảnh nội tuyến, hãy sử dụng phương thức embed trên biến $message trong mẫu email của bạn. Laravel tự động cung cấp biến có sẵn $message cho tất cả các mẫu email của bạn, vì vậy bạn không cần phải lo lắng về việc truyền nó vào theo cách thủ công:

<body>
    Here is an image:

    <img src="{{ $message->embed($pathToImage) }}">
</body>

Biến $message không có sẵn trong các mẫu nhắn văn bản đơn giản kể từ thông điệp văn bản đơn giản không sử dụng file đính kèm nội tuyến.

Nhúng tệp đính kèm dữ liệu thô

Nếu bạn đã có một chuỗi dữ liệu hình ảnh thô mà bạn muốn nhúng vào mẫu email, bạn có thể gọi phương thức embedData trên biến $message. Khi gọi phương thức embedData, bạn sẽ cần cung cấp tên tệp sẽ được gán cho hình ảnh được nhúng:

<body>
    Here is an image from raw data:

    <img src="{{ $message->embedData($data, 'example-image.jpg') }}">
</body>

Tùy chỉnh tin nhắn SwiftMailer

Phương thức withSwiftMessage của lớp Mailable cho phép bạn đăng ký một kết thúc mà sẽ được gọi bằng các ví dụ nhắn SwiftMailer trước khi gửi tin nhắn. Điều này mang lại cho bạn cơ hội tùy chỉnh sâu sắc thông điệp trước khi nó được gửi đi:

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

    $this->withSwiftMessage(function ($message) {
        $message->getHeaders()->addTextHeader(
            'Custom-Header', 'Header Value'
        );
    });

    return $this;
}

Markdown Mailable

Dấu thư có thể gửi qua thư cho phép bạn tận dụng các mẫu và thành phần được tạo sẵn của thông báo thư trong thư của bạn. Vì các tin nhắn được viết bằng Markdown, Laravel có thể hiển thị các mẫu HTML đẹp, đáp ứng cho các tin nhắn trong khi cũng tự động tạo một bản đối chiếu văn bản thuần túy.

Tạo các hộp thư Markdown

Để tạo một thư có thể gửi với một mẫu Markdown tương ứng, bạn có thể sử dụng tùy chọn --markdown như sau:

php artisan make:mail OrderShipped --markdown=emails.orders.shipped

Sau đó, khi định cấu hình mailable bên trong phương thức build, hãy gọi phương thức markdown thay vì phương thức view. Phương thức markdown chấp nhận tên của mẫu Markdown và một mảng tùy chọn dữ liệu để cung cấp cho các mẫu:

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->from('example@example.com')
                ->markdown('emails.orders.shipped', [
                    'url' => $this->orderUrl,
                ]);
}

Viết tin nhắn đánh dấu

Markdown sử dụng kết hợp các thành phần Blade và cú pháp Markdown cho phép bạn dễ dàng tạo các thông điệp mail trong khi tận dụng các thành phần UI email được xây dựng trước của Laravel:

@component('mail::message')
# Order Shipped

Your order has been shipped!

@component('mail::button', ['url' => $url])
View Order
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

Không sử dụng thụt lề quá mức khi viết email Markdown. Theo tiêu chuẩn Markdown, trình phân tích cú pháp Markdown sẽ hiển thị nội dung được thụt lề dưới dạng các khối mã.

Thành phần nút

Thành phần nút hiển thị một liên kết nút được căn giữa. Thành phần chấp nhận hai đối số, một url và một tùy chọn color. Màu sắc được hỗ trợ là primarysuccess, và error. Bạn có thể thêm nhiều thành phần nút vào một tin nhắn như bạn muốn:

@component('mail::button', ['url' => $url, 'color' => 'success'])
View Order
@endcomponent

Thành phần bảng điều khiển

Thành phần bảng hiển thị khối văn bản nhất định trong một bảng có màu nền hơi khác so với phần còn lại của thông báo. Điều này cho phép bạn thu hút sự chú ý vào một khối văn bản nhất định:

@component('mail::panel')
This is the panel content.
@endcomponent

Thành phần bảng

Thành phần bảng cho phép bạn chuyển đổi bảng Markdown thành một bảng HTML. Thành phần chấp nhận bảng Markdown làm nội dung của nó. Căn chỉnh cột trong bảng được hỗ trợ bằng cú pháp căn chỉnh bảng Markdown mặc định:

@component('mail::table')
| Laravel       | Table         | Example  |
| ------------- |:-------------:| --------:|
| Col 2 is      | Centered      | $10      |
| Col 3 is      | Right-Aligned | $20      |
@endcomponent

Tùy chỉnh các thành phần

Bạn có thể xuất tất cả các thành phần thư Markdown sang ứng dụng của riêng mình để tùy chỉnh. Để xuất các thành phần, hãy sử dụng lệnh Artisan vendor:publish để xuất bản thẻ nội dung laravel-mail:

php artisan vendor:publish --tag=laravel-mail

Lệnh này sẽ xuất bản các thành phần thư Markdown vào thư mục resources/views/vendor/mail. Thư mục mail sẽ chứa một html và một thư mục text, mỗi thư mục chứa các đại diện tương ứng của mọi thành phần có sẵn. Bạn có thể tự do tùy chỉnh các thành phần này theo cách bạn muốn.

Tùy chỉnh CSS

Sau khi xuất các thành phần, thư mục resources/views/vendor/mail/html/themes sẽ chứa một file default.css. Bạn có thể tùy chỉnh CSS trong tệp này và các kiểu của bạn sẽ tự động được chuyển đổi thành các kiểu CSS nội tuyến trong các biểu diễn HTML của thư Markdown của bạn.

Nếu bạn muốn xây dựng một chủ đề hoàn toàn mới cho các thành phần Markdown của Laravel, bạn có thể đặt một tệp CSS trong thư mục html/themes. Sau khi đặt tên và lưu tệp CSS của bạn, hãy cập nhật tùy chọn theme của file cấu hình config/mail.php của ứng dụng để khớp với tên của chủ đề mới của bạn.

Để tùy chỉnh chủ đề cho một lớp có thể gửi thư riêng lẻ, bạn có thể đặt thuộc tính $theme của lớp có thể gửi thư thành tên của chủ đề sẽ được sử dụng khi gửi tệp có thể gửi thư đó.

Gửi thư

Để gửi tin nhắn, hãy sử dụng phương thức to trên facades Mail. Phương thức to chấp nhận một địa chỉ email, một người dùng cụ thể, hoặc một tập người dùng. Nếu bạn truyền một đối tượng hoặc tập hợp các đối tượng, thư sẽ tự động sử dụng các thuộc tính email và name của chúng khi xác định người nhận email, vì vậy hãy đảm bảo các thuộc tính này có sẵn trên các đối tượng của bạn. Khi bạn đã chỉ định người nhận của mình, bạn có thể chuyển một phiên bản của lớp có thể gửi thư của mình vào phương thức send:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Mail\OrderShipped;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class OrderShipmentController extends Controller
{
    /**
     * Ship the given order.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $order = Order::findOrFail($request->order_id);

        // Ship the order...

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

Bạn không bị giới hạn trong việc chỉ định người nhận "to" khi gửi tin nhắn. Bạn có thể tự do đặt người nhận "to", "cc" và "bcc" bằng cách xâu chuỗi các phương thức tương ứng của chúng với nhau:

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

Vòng lặp qua người nhận

Đôi khi, bạn có thể cần gửi một thư đến danh sách người nhận bằng cách lặp lại một loạt các địa chỉ email/người nhận. Tuy nhiên, vì phương thức to thêm các địa chỉ email vào danh sách người nhận của mailable, mỗi lần lặp qua vòng lặp sẽ gửi một email khác đến mọi người nhận trước đó. Do đó, bạn nên luôn tạo lại phiên bản có thể gửi thư cho từng người nhận:

foreach (['taylor@example.com', 'dries@example.com'] as $recipient) {
    Mail::to($recipient)->send(new OrderShipped($order));
}

Gửi thư qua một trình gửi thư cụ thể

Theo mặc định, Laravel sẽ gửi email bằng cách sử dụng phong bì được định cấu hình làm phong bì default trong file cấu hình mail của ứng dụng của bạn. Tuy nhiên, bạn có thể sử dụng phương thức mailer để gửi thư bằng cách sử dụng cấu hình bưu phẩm cụ thể:

Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));

Xếp hàng thư

Xếp hàng một Tin nhắn Thư

Vì việc gửi email có thể tác động tiêu cực đến thời gian phản hồi ứng dụng của bạn, nhiều nhà phát triển chọn cách xếp hàng email để gửi trong nền. Laravel làm cho việc này trở nên dễ dàng bằng cách sử dụng API hàng đợi thống nhất được tích hợp sẵn. Để xếp hàng một thư, hãy sử dụng phương thức queue trên facades Mail sau khi chỉ định người nhận thư:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->queue(new OrderShipped($order));

Phương thức này sẽ tự động thực hiện việc đẩy một công việc vào hàng đợi để thông báo được gửi ở chế độ nền. Bạn sẽ cần phải định cấu hình hàng đợi của mình trước khi sử dụng tính năng này.

Xếp hàng đợi tin nhắn bị trễ

Nếu bạn muốn trì hoãn việc gửi một email đã được xếp hàng đợi, bạn có thể sử dụng phương thức later. Là đối số đầu tiên của nó, phương thức later chấp nhận một đối tượng DateTime để cho biết khi nào thông báo sẽ được gửi đi:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->later(now()->addMinutes(10), new OrderShipped($order));

Đẩy đến hàng đợi cụ thể

Vì tất cả các lớp có thể gửi thư được tạo bằng lệnh make:mail sử dụng Illuminate\Bus\Queueable, bạn có thể gọi các phương thức onQueue và onConnection trên bất kỳ lớp có thể gửi thư nào, cho phép bạn chỉ định kết nối và tên hàng đợi cho thư:

$message = (new OrderShipped($order))
                ->onConnection('sqs')
                ->onQueue('emails');

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->queue($message);

Hàng đợi mặc định

Nếu bạn có các lớp có thể gửi thư mà bạn muốn luôn được xếp hàng đợi, bạn có thể thực hiện hợp đồng ShouldQueue trên lớp đó. Bây giờ, ngay cả khi bạn gọi phương thức send khi gửi thư, có thể gửi thư vẫn sẽ được xếp hàng đợi vì nó thực hiện hợp đồng:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    //
}

Giao dịch cơ sở dữ liệu và thư được xếp hàng đợi

Khi các thư được xếp hàng đợi được gửi đi trong các giao dịch cơ sở dữ liệu, chúng có thể được hàng đợi xử lý trước khi giao dịch cơ sở dữ liệu được cam kết. Khi điều này xảy ra, bất kỳ cập nhật nào bạn đã thực hiện cho các mô hình hoặc bản ghi cơ sở dữ liệu trong quá trình giao dịch cơ sở dữ liệu có thể chưa được phản ánh trong cơ sở dữ liệu. Ngoài ra, bất kỳ mô hình hoặc bản ghi cơ sở dữ liệu nào được tạo trong giao dịch có thể không tồn tại trong cơ sở dữ liệu. Nếu có thể gửi thư của bạn phụ thuộc vào các mô hình này, lỗi không mong muốn có thể xảy ra khi công việc gửi thư có thể xếp hàng đợi được xử lý.

Nếu tùy chọn cấu hình after_commit của kết nối hàng đợi của bạn được đặt thành false, bạn vẫn có thể chỉ ra rằng một thư có thể xếp hàng đợi cụ thể sẽ được gửi đi sau khi tất cả các giao dịch cơ sở dữ liệu mở đã được cam kết bằng cách xác định một thuộc tính $afterCommit trên lớp có thể gửi thư:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    public $afterCommit = true;
}

Để tìm hiểu thêm về cách giải quyết những vấn đề này, vui lòng xem lại tài liệu liên quan đến các công việc được xếp hàng đợi và giao dịch cơ sở dữ liệu .

Kết xuất các thư

Đôi khi bạn có thể muốn nắm bắt nội dung HTML của một thư có thể gửi mà không cần gửi. Để thực hiện điều này, bạn có thể gọi phương thức render của thư. Phương thức này sẽ trả về nội dung HTML được đánh giá của thư có thể gửi dưới dạng một chuỗi:

use App\Mail\InvoicePaid;
use App\Models\Invoice;

$invoice = Invoice::find(1);

return (new InvoicePaid($invoice))->render();

Xem trước các hộp thư trong trình duyệt

Khi thiết kế mẫu của một thư, thật tiện lợi để nhanh chóng xem trước mẫu có thể gửi được trong trình duyệt của bạn giống như mẫu Blade điển hình. Vì lý do này, Laravel cho phép bạn trả lại bất kỳ thư nào có thể gửi trực tiếp từ controller hoặc closure. Khi một thư có thể được trả lại, nó sẽ được hiển thị và hiển thị trong trình duyệt, cho phép bạn nhanh chóng xem trước thiết kế của nó mà không cần gửi nó đến một địa chỉ email thực tế:

Route::get('/mailable', function () {
    $invoice = App\Models\Invoice::find(1);

    return new App\Mail\InvoicePaid($invoice);
});

Các tệp đính kèm nội tuyến sẽ không được hiển thị khi một tệp có thể gửi được xem trước trong trình duyệt của bạn. Để xem trước các thư này, bạn nên gửi chúng đến một ứng dụng kiểm tra email như MailHog hoặc HELO.

Bản địa hóa các thư

Laravel cho phép bạn gửi thư ở một ngôn ngữ khác với ngôn ngữ hiện tại của yêu cầu và thậm chí sẽ nhớ ngôn ngữ này nếu thư được xếp hàng đợi.

Để thực hiện điều này, facades Mail cung cấp một phương thức là locale để thiết lập ngôn ngữ mong muốn. Ứng dụng sẽ thay đổi thành ngôn ngữ này khi mẫu của thư có thể đang được đánh giá và sau đó hoàn nguyên về ngôn ngữ trước đó khi quá trình đánh giá hoàn tất:

Mail::to($request->user())->locale('es')->send(
    new OrderShipped($order)
);

Ngôn ngữ ưa thích của người dùng

Đôi khi, các ứng dụng lưu trữ ngôn ngữ ưa thích của mỗi người dùng. Bằng cách thực hiện hợp đồng HasLocalePreference trên một hoặc nhiều mô hình của bạn, bạn có thể hướng dẫn Laravel sử dụng ngôn ngữ được lưu trữ này khi gửi thư:

use Illuminate\Contracts\Translation\HasLocalePreference;

class User extends Model implements HasLocalePreference
{
    /**
     * Get the user's preferred locale.
     *
     * @return string
     */
    public function preferredLocale()
    {
        return $this->locale;
    }
}

Khi bạn đã triển khai giao diện, Laravel sẽ tự động sử dụng ngôn ngữ ưa thích khi gửi thư và thông báo tới mô hình. Do đó, không cần gọi phương thức locale khi sử dụng giao diện này:

Mail::to($request->user())->send(new OrderShipped($order));

Kiểm tra thư

Laravel cung cấp một số phương thức thuận tiện để kiểm tra xem thư của bạn có chứa nội dung mà bạn mong đợi hay không. Những phương thức này là: assertSeeInHtmlassertDontSeeInHtmlassertSeeInText, và assertDontSeeInText.

Như bạn có thể mong đợi, các xác nhận "HTML" xác nhận rằng phiên bản HTML của thư của bạn có chứa một chuỗi nhất định, trong khi các xác nhận "text" khẳng định rằng phiên bản văn bản thuần túy của thư của bạn chứa một chuỗi nhất định:

use App\Mail\InvoicePaid;
use App\Models\User;

public function test_mailable_content()
{
    $user = User::factory()->create();

    $mailable = new InvoicePaid($user);

    $mailable->assertSeeInHtml($user->email);
    $mailable->assertSeeInHtml('Invoice Paid');

    $mailable->assertSeeInText($user->email);
    $mailable->assertSeeInText('Invoice Paid');
}

Kiểm tra tính năng gửi có sẵn

Chúng tôi khuyên bạn nên kiểm tra nội dung của thư một cách riêng biệt với các bài kiểm tra của bạn để xác nhận rằng một thư cụ thể đã được "gửi" đến một người dùng cụ thể. Để tìm hiểu cách kiểm tra xem thư giả có được gửi hay không, hãy xem tài liệu của chúng tôi về Thư giả mạo.

Phát triển Thư & Địa phương

Khi phát triển một ứng dụng gửi email, có thể bạn không muốn thực sự gửi email đến các địa chỉ email trực tiếp. Laravel cung cấp một số cách để "vô hiệu hóa" việc gửi email thực tế trong quá trình phát triển cục bộ.

Trình điều khiển ghi nhật ký (Log Driver)

Thay vì gửi email của bạn, trình điều khiển thư log sẽ ghi tất cả các email vào tệp nhật ký của bạn để kiểm tra. Thông thường, trình điều khiển này sẽ chỉ được sử dụng trong quá trình phát triển cục bộ. Để biết thêm thông tin về cách định cấu hình ứng dụng của bạn cho mỗi môi trường, hãy xem tài liệu cấu hình.

HELO/Mailtrap/MailHog

Cuối cùng, bạn có thể sử dụng một dịch vụ như HELO hoặc Mailtrap và trình điều khiển smtp để gửi email của bạn đến một hộp thư "giả" nơi bạn có thể xem chúng trong một ứng dụng email thực sự. Cách tiếp cận này có lợi ích là cho phép bạn thực sự kiểm tra các email cuối cùng trong trình xem thư của Mailtrap.

Nếu bạn đang sử dụng Laravel Sail, bạn có thể xem trước thư của mình bằng MailHog. Khi Sail đang chạy, bạn có thể truy cập vào giao diện MailHog tại địa chỉ: http://localhost:8025.

Sự kiện

Laravel kích hoạt hai sự kiện trong quá trình gửi thư. Sự kiện MessageSending được kích hoạt trước khi tin nhắn được gửi đi, trong khi sự kiện MessageSent được kích hoạt sau khi tin nhắn được gửi đi. Hãy nhớ rằng, những sự kiện này được kích hoạt khi thư đang được gửi đi, không phải khi nó được xếp hàng đợi. Bạn có thể đăng ký người nghe sự kiện cho sự kiện này trong nhà cung cấp dịch vụ App\Providers\EventServiceProvider:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Mail\Events\MessageSending' => [
        'App\Listeners\LogSendingMessage',
    ],
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Listeners\LogSentMessage',
    ],
];
» Tiếp: Biên dịch các asset (Compiling Assets)
« Trước: Xác thực (Validation)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!