Mail Trong Laravel Là Gì?

Mail Trong Laravel Là Gì?
Các bạn có biết Laravel có tính năng cho phép chúng ta tạo các email và gửi nó đi? Nếu chưa, thì hãy đọc bài chia sẻ dưới đây. Sau đó thì các bạn thực hành thử.

Hệ thống Laravel cung cấp API đơn giản và sạch hơn thư viện Swiftmailer thông thường. Nó có các driver SMTP, Mailgun, Amazon SES, SparkPost, PHP email và sendmail. Do đó, các bạn có thể gửi email nhanh gọn thông qua local hoặc điện toán đám mây. 

 

Các loại driver prerequisites

 

Thông thường, các API dựa trên driver Mailgun và SparkPost rất đơn giản trong các thao tác và vận hành cũng nhanh hơn server của SMTP. Các bạn nên sử dụng các driver đó. Toàn bộ API driver yêu cầu có thư viện Guzzle HTTP (có thể cài thông qua composer). 

 

composer require guzzlehttp/guzzle

 

Mailgun driver 

 

Mailgun driver sẽ là lựa chọn hàng đầu khi các bạn chọn dùng các API đơn giản trong Laravel. Đầu tiên, các bạn nên cài Guzzle. Tiếp theo, bạn cần cấu hình driver trong file config/mail.php vào Mailgun. Kế tiếp, bạn xác định file config/services.php phải theo cấu hình options. 

 

'mailgun' => [
    'domain' => 'your-mailgun-domain',
    'secret' => 'your-mailgun-key',
],

 

Sparkpost driver

 

Tương tự như Mailgun driver, các bạn cần cài Guzzle để sử dụng Sparkpost driver. Tiếp theo, bạn thiết lập các điều khiển trong config/mail.php cho sparkpost. Sau thao tác đó, bạn tiếp tục thiết lập cho file config/services.php.

 

'sparkpost' => [

    'secret' => 'your-sparkpost-key',

],

 

SES driver

 

Để có thể bắt đầu sử dụng Amazon SES, bạn cần cài Amazon AWS SDK cho PHP. Bạn cũng có thể cài thư viện đó khi bổ sung các dòng lệnh sau trong file composer.json. 

 

"aws/aws-sdk-php": "~3.0"

 

Đừng quên chạy thêm dòng lệnh này:

 

composer update

 

Tiếp theo, bạn thiết lập SES driver trong file config/mail.php và xác nhận trong file `config/services.php`

 

'ses' => [

    'key' => 'your-ses-key',

    'secret' => 'your-ses-secret',

    'region' => 'ses-region',  // e.g. us-east-1

],

 

Generating mailables là gì?

 

Trên hệ thống Laravel, mỗi loại email thường được gửi từ ứng dụng của bạn được gọi là một lớp mailable. Các lớp này được lưu trong thư mục app/Mail. Nếu không thấy thư mục đó trong ứng dụng, thì bạn phải làm sao? Thư mục đó sẽ xuất hiện khi bạn tạo lớp mailable đầu tiên thông qua câu lệnh sau đây: 

 

php artisan make:mail OrderShipped

 

Writing mailables là gì?

 

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

 

Cấu hình người gửi 

 

Sử dụng method from

 

Các bạn nên tìm hiểu các cấu hình của người gửi email. Đó có thể là từ những người gửi email của from. Có 2 cách để chúng ta cấu hình cho người gửi email. 

 

Bạn có thể 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');

}

 

Sử dụng a global từ address 

 

Nếu ứng dụng của bạn có cùng địa chỉ from cho tất cả email, thì nó có thể chuyển nặng để gọi method from từ class mailable mà bạn tạo ra. Thay vào đó, bạn cũng có thể dùng địa chỉ from toàn bộ trong file cấu hình config/mail.php. Địa chỉ đó sẽ được 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'],

 

Cấu hình chế độ xem 

 

Trong chuyện xây dựng method của class mailable, bạn thử sử dụng method view để xác định template (khi render nội dung của email). Vì mỗi email có một blade template để hiển thị nội dung riêng biệt của nó. Do đó, bạn có thể xây dựng HTML của email của chính bạn (dựa vào blade template). 

 

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

 

Email văn bản thuần túy 

 

Nếu muốn định nghĩa một văn bản thuần túy trong email, các bạn có thể sử dụng method text. Tương tự như method view, method text cho phép chúng ta thực hiện template mẫu để hiển thị nội dung của email. Bạn được tự do định nghĩa 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');
}

 

View data 

 

Thông qua các thuộc tính của cộng đồng 

 

Nếu bạn muốn vượt qua một số dữ liệu để xem trước view, thì bạn có thể tạo dữ liệu có sẵn để kiểm tra view của bạn. Bất cứ thuộc tính nào (được định nghĩa trong class mailable của bạn) có thể tự tạo sẵn view để xem. 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. 



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');
    }
}

 

Khi dữ liệu đã được thiết lập, nó tự view cho bạn. Bạn có thể truy cập bất cứ dữ liệu nào khác trong blade templates. 

 

<div>
    Price: 

</div>

 

Thông qua method with

 

Nếu muốn tùy chỉnh định dạng của dữ liệu email trước khi gửi, thì bạn có thể truyền dữ liệu để xem và thực hiện điều này thông qua method with.

 

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,
            ]);
    }

}

 

Các tập tin đính kèm vào trong email

 

Đính kèm bất kỳ tập tin nào vào email cũng đơn giản. Các bạn chỉ cần sử dụng các method attach được xây dựng trong class mailable. Phương pháp attach chấp nhận đường dẫn đầy đủ đến tập tin, ví dụ đổi số đầu tiên của nó. 

 

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

 

Khi gắn một tập tin vào một tin nhắn, bạn nên ghi rõ tên hiển thị và loại MIME bằng cách thông qua mảng (ví dụ là đối số thứ 2 của phương pháp 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',
        ]);
}

 

Tập tin thuần được đính kèm vào

 

Các bạn có thể sử dụng phương thức attachData như tính năng đính kèm một tập tin. Sử dụng phương pháp này nếu bạn đã tạo ra một file PDF trong bộ nhớ và muốn đính kèm vào email mà không phải lưu nó vào đĩa. Phương thức này đồng ý các byte dữ liệu thô giống như là đối số đầu tiên. Tên của tập tin là đối số thứ nhì và một mảng các tùy chọn 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',
        ]);
}

 

Loại tập tin đính kèm nội tuyến 

 

Có phải nhúng hình ảnh nội tuyến vào email thường nặng và cồng kềnh đúng không? Với Laravel, chuyện đó trở nên bình thường. Laravel có cung cấp cách đính kèm thuận tiện hơn và nó cũng tự động truy xuất CID phù hợp. Để nhúng một hình nội tuyến, bạn nên sử dụng phương pháp embed trên các biến $message trong mẫu email. Hệ thống Laravel sẽ tự thực hiện biến $message có sẵn cho toàn bộ các mẫu email của bạn. Bạn không bị bỏ sót bất cứ email nào. 

 

<body>
    Here is an image:
    <img src="">
</body>

 

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

 

Nếu bạn đã có một loạt dữ liệu thô và muốn nhúng vào một mẫu email, thì bạn có thể sử dụng phương pháp embedData vào biến $message. 

 

<body>
    Here is an image from raw data:
    <img src="">
</body>

 

Gửi email 

 

Để gửi đi một tin nhắn, bạn có thể sử dụng phương pháp to trên Mail façade. Phương pháp to cho phép chúng ta tìm một địa chỉ email, một người dùng thực tế và một số người dùng khác nhau. Nếu truyền vào một đối tượng hoặc một tập tin thuộc các đối tượng, thì mailer sẽ tự sử dụng email và tên tài sản của họ để đặt email người nhận. Khi bạn đã biết người nhận chính xác là ai, bạn có thể truyền vào một trường hợp cụ thể trong lớp mailable trong phương thức send. 

 

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));
    }
}

 

Đừng lo chuyện bị giới hạn số người nhận email vì Laravel cho phép bạn gửi hàng ngàn người nhận email. Bạn cũng có thể tạo to, cc và bcc như thế này: 

 

Mail::to($request->user())

        ->cc($moreUsers)

        ->bcc($evenMoreUsers)

        ->send(new OrderShipped($order));

 

Sắp xếp các email 

 

Xếp các email thành các tin nhắn: từ khi bạn gửi email, bạn có thể kéo dài thời gian phản hồi của ứng dụng. Nhiều bạn lập trình viên đã chọn tính năng queue cho nền tảng gửi email của họ. Laravel cũng có tính năng queue API hỗ trợ vấn đề này. Để xếp một email vào thành hàng, bạn nên dùng phương thức queue trong Mail façade (sau khi đã xác nhận người sẽ nhận email). 

 

Mail::to($request->user())

        ->cc($moreUsers)

        ->bcc($evenMoreUsers)

        ->queue(new OrderShipped($order));

 

Xếp hàng thư đợi tin nhắn trễ

 

Nếu muốn trì hoãn chuyện gửi email, thì bạn có thể sử dụng phương thức later. Phương thức later cho phép tham số Datetime hoạt động khi email được gửi đi. 

 

$when = Carbon\Carbon::now()->addMinutes(10);

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

 

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

 

Tất cả class mailable được thiết lập bằng cách sử dụng câu lệnh make:mail và các đặc điểm của Illuminate\Bus\Queueable, bạn có thể gọi phương thức onQueue và onConnection trong bất cứ class mailable nào có thể gửi email đi. Nó hỗ trợ bạn xác định kết nối và tạo hàng đợi của bất cứ các tin nhắn nào. 

 

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

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

 

Xếp hàng thư theo một mặc định 

 

Nếu có các class mailable mà bạn muốn chúng luôn trong trạng thái đã xếp hàng ngay ngắn và chờ hoạt động, thì bạn xây dựng nó trong một class ShouldQueue. Ngay cả khi bạn gọi phương thức send trong khi gửi email, mailable vẫn đang xếp hàng đợi bạn. 

 

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    //
}

 

Phát triển mail và phần địa phương 

 

Khi phát triển một ứng dụng gửi email, bạn có thực sự muốn gửi email đến địa chỉ email còn hoạt động? Laravel có vô số cách để bạn vô hiệu hóa việc gửi email này trong khi phát triển ở local. 

 

  • Log Driver sẽ thực hiện đầy đủ các tin nhắn đến file log của bạn để kiểm tra. 
  • Universal To: cho phép bạn cấu hình một địa chỉ email để gửi đi và có thể trong file config/mail.php

 

'to' => [
    'address' => '[email protected]',
    'name' => 'Example'
],

 

Các sự kiện 

 

Hệ thống Laravel có tính năng kích hoạt các sự kiện trước khi gửi tin nhắn qua thư. Sự kiện này thường phát sinh khi email được gửi đi. Bạn có thể đăng ký một sự kiện hoặc nghe cho sự kiện trong EventServiceProvider. 

 

/**
 * The event listener mappings for the application.
 *
 * @var  array
 */
protected $listen = [
    'Illuminate\Mail\Events\MessageSending' => [
        'App\Listeners\LogSentMessage',
    ],
];

Ngọc Nguyễn

Hãy viết code như thể người maintain là một đứa sát nhân điên cuồng biết địa chỉ nhà bạn.

Bình luận (0)