Mail in Laravel (P2)
Bài đăng này đã không được cập nhật trong 8 năm
Tiếp nối với bài viết lần trước Mail in Laravel, bài viết lần này mình sẽ trình bày tiếp vê phần Mail trong Laravel.
3. Writing Mailables
d. Attachments
- Để đính kèm tập tin vào một email, 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 như là đố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 tập tin vào một tin nhắn, bạn cũng có thể ghi rõ tên hiển thị và / hoặc loại MIME bằng cách thông qua một mảng như là đối số thứ hai 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',
]);
}
- Raw Data Attachments: phương thức attachData có thể được sử dụng đính kèm một tệp tin. Ví dụ, bạn có thể 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 ghi nó vào đĩa. Phương thức attachData chấp nhận các byte dữ liệu thô 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 mảng 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',
]);
}
- Inline Attachments: 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 và truy xuất CID thích hợp. Để nhúng một hình ảnh nội tuyến, sử dụng phương pháp embed trên các biến $message trong mẫu email của bạn. Laravel tự động làm cho biến $message có sẵn cho tất cả các mẫu email của bạn, do đó bạn không cần phải lo lắng về việc bỏ qua nó:
<body>
Here is an image:
<img src="{{ $message->embed($pathToFile) }}">
</body>
- Embedding Raw Data Attachments: Nếu bạn đã có một chuỗi dữ liệu thô mà bạn muốn nhúng vào một mẫu email, 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="{{ $message->embedData($data, $name) }}">
</body>
4. Sending Mail
- Để gửi một tin nhắn, sử dụng phương pháp
to
trênMail facade
. Phương phápto
cho phép một địa chỉ email, một người dùng, hoặc một số người dùng khác nhau. Nếu bạn tryền vào một đối tượng hoặc một tập của các đối tượng, thì mailer sẽ tự động sử dụng email và tên tài sản của họ để đặt email người nhận. Một khi bạn đã xác định người nhận, bạn có thể truyền vào một trường hợp cụ thể trong lớp mailable của bạn trong phương thứcsend
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));
}
}
- Tất nhiên,bạn không bị giới hạn số người nhận mail. Ngoài ra, bạn có thể thiết lập
to
,cc
, vàbcc
bằng cách:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->send(new OrderShipped($order));
- Queueing Mail
- Queueing A Mail Message: Kể từ khi gửi mail có thể kéo dài thời gian phản hồi của ứng dụng của bạn, nhiều nhà phát triển đã chọn queue cho nền tảng gửi mail. Laravel đã xây dựng queue API dễ dàng sử dụng (bạn có thể tham khảo bài viết về queue trong Laravel ở đây). Để queue một mail, sử dụng phương thức
queue
trongMail facade
, sau khi xác nhận người nhận mail.
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue(new OrderShipped($order));
- Delayed Message Queueing: Nếu bạn muốn hoãn việc gửi mail trong hảng đợi, bạn có thể sử dụng phương thức
later
. Như là đối số đầu tiên của nó, phương thứclater
cho phép tham sốDatetime
khi mail được gửi
$when = Carbon\Carbon::now()->addMinutes(10);
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->later($when, new OrderShipped($order));
- Pushing To Specific Queues: Vì tất cả các class
mailable
được tạo ra bằng cách sử dụng câu lệnhmake:mail
sử dụng các đặc sắc củaIlluminate\Bus\Queueable
, bạn có thể gọi phương thứconQueue
vàonConnection
trong bất kỳ classmailable
nào có thể gửi mail, cho phép bạn xác định kết nối và tên hàng đợi cuả bất kỳ cho các tin nhắn.
$message = (new OrderShipped($order))
->onConnection('sqs')
->onQueue('emails');
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue($message);
- Queueing By Default: Nếu bạn có các class
mailable
mà bạn muốn luôn luôn được xếp hàng đợi, bạn có thể xây dựng nó trong một classShouldQueue
. Bây giở, ngay cả khi bạn gọi phương thứcsend
trong gửi thư, mailable vẫn được xếp hàng đợi.
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderShipped extends Mailable implements ShouldQueue
{
//
}
5. Mail & Local Development
-
Khi phát triển một ứng dụng gửi mail, có thể bạn thực sự không muốn gửi đến địa chỉ email còn hoạt động. Laravel cung cấp cho bạn nhiều cách để vô hiệu hóa việc gửi này trong khi phát triển ở local.
-
Log Driver: Thay vì gửi mail của bạn, log mail driver sẽ viết tất cả các tin nhắn tới file log của bạn để kiểm tra.
-
Universal To: Bạn có thể cấu hình một địa chỉ email để gửi đến trong
config/mail.php
'to' => [
'address' => 'example@example.com',
'name' => 'Example'
],
6. Events
- Laravel kích hoạt sự kiện trước khi gửi tin nhắn qua thư. Hãy nhớ rằng, sự kiện này phát sinh khi mail được gửi đi, không phải khi nó được xếp hàng đợi. Bạn có thể đăng ký một sự kiện nghe cho sự kiện này trong EventServiceProvider của bạn:
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Mail\Events\MessageSending' => [
'App\Listeners\LogSentMessage',
],
];
Tài liệu tham khảo: https://laravel.com/docs/5.3/mail
All rights reserved