Mail in Laravel (P1)
Bài đăng này đã không được cập nhật trong 8 năm
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 choconfig/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 choconfig/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 methodbuild
của classmailable
.
- Thứ nhất, bạn có thể sử dụng method
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com')
->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 methodfrom
từ classmailable
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ìnhconfig/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 classmailable
- Tuy nhiên, nếu ứng dụng của bạn sử dụng cùng một địa chỉ
'from' => ['address' => 'example@example.com', '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ư methodview
, methodtext
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 methodwith
.
<?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