Laravel và những điều cần biết - phần 2
Giới thiệu Tiếp theo loạt bài viết về Laravel. Hôm nay chúng ta sẽ đi tìm hiểu: Mail Schedule Nội dung 1. Mail Laravel cũng cấp một API với trình điều khiển cho SMTP, Mailgun, SparkPost, Amazon SES, sendmail giúp việc gửi mail nhanh chóng và dễ dàng hơn. Chuẩn bị Để có thể gửi ...
Giới thiệu
Tiếp theo loạt bài viết về Laravel. Hôm nay chúng ta sẽ đi tìm hiểu:
- Schedule
Nội dung
1. Mail
Laravel cũng cấp một API với trình điều khiển cho SMTP, Mailgun, SparkPost, Amazon SES, sendmail giúp việc gửi mail nhanh chóng và dễ dàng hơn.
Chuẩn bị
Để có thể gửi được mail bạn cần cài thêm package guzzlehttp/guzzle
composer require guzzlehttp/guzzle
Config
Tiếp theo cần quan cấu hình các tham số cho quá trình gửi mail Tất cả cấu hình và cài đặt để gửi được một email đều có trong file app/config/mail.php. Các tham số
- driver: Config driver bạn muốn dùng để gửi mail. Mặc định của Laravel sẽ dùng SMTP driver. Tuy nhiên bạn cũng có thể thay đổi sang một driver khác.
- host: Địa chỉ của mail server
- post: Cổng của để gửi mail.
- from: Trường này cho phép bạn cài đặt trường from trong email như: Địa chỉ gửi mail, tên người gửi
- encryption: Đây là giao thức mã hóa sẽ được sử dụng bất cứ khi nào email được gửi đi. Thường sử dụng với 2 giao thức mã hóa chính là ssl và tls.
- username: Địa chỉ email gửi đi
- password: Mật khẩu email gửi đi
- sendmail: Đường dẫn tới SendMail, nếu SendMail driver được sử dụng trên server
Thông thường, ta cấu hình các thông số trên trong file .env với các trường tương ứng: MAIL_DRIVER, MAIL_HOST, MAIL_PORT, MAIL_FROM_ADDRESS, MAIL_FROM_NAME, MAIL_ENCRYPTION, MAIL_USERNAME, MAIL_PASSWORD.
Sử dụng Mailgun
Để sử dụng được Mailgun bạn cần phải đăng kí tài khoản tại đây và config MAIL_DRIVER trong file .env thành mailgun. Tiếp đó config mailgun trong file config/services.php hoặc file .env. Nhập domain (MAILGUN_DOMAIN) và secret (MAILGUN_SECRET) mà bạn nhận được khi đăng kí tài khoản.
Trong laravel từng loại mail gửi đi sẽ được thể hiện như 1 class Mailables. Tất cả Mailables sẽ được lưu trong thư mục app/Mail. Tạo lớp Mailables gửi mail:
php artisan make:mail MailTest
Cấu hình view cho nội dung của mail trong phương thức build:
public function build() { return $this->view('emails.mailTp'); }
Thêm data cho view
Để truyền data vào view ta sẽ khai báo biến public trong Mailables class và tạo nó trong hàm khởi tạo __construct. Laravel sẽ tự động truyền vào view cho ta.
<?php namespace AppMail; use IlluminateBusQueueable; use IlluminateMailMailable; use IlluminateQueueSerializesModels; use IlluminateContractsQueueShouldQueue; use AppUser; class MailTest extends Mailable { use Queueable, SerializesModels; public $user; /** * Create a new message instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Build the message. * * @return $this */ public function build() { return $this->view('emails.mailTp'); } }
Tạo view:
{!! $user->id !!} <br/> {!! $user->name !!} <br/> {!! $user->email !!}
Gửi mail: Để gửi mail cho 1 hay nhiều người ta dùng câu lệnh: Mail::to(User::find(2)->email)->send(new MailTest(User::find(2))); Chúng ta có thể CC, BCC mail cho địa chỉ mail khác bằng cách sử dụng hàm cc và bcc
Mail::to($request->user()) ->cc($moreUsers) ->bcc($evenMoreUsers) ->send(new OrderShipped($order));
Đính kèm: Để đính kèm 1 tập tin trong mail ta sử dụng phương thức attach. Tham số truyền vào là đường dẫn đến file cần đính kèm.
public function build() { return $this->view('emails.orders.shipped') ->attach('/path/to/file.pdf'); }
2. Schedule
Schedule là gì
Schedule cũng giống như Cron Job thôi. Nó cũng có mục đích là tạo các task, chạy tự động trên server. Cơ chế hoạt động của Schedule là máy chủ sẽ có 1 Cron chạy Laravel Schedule sau một khoảng thời gian ngắn. Schedule sẽ chạy theo lịch thế nào là do bạn lập trình trong code của Laravel. Như vậy, khi muốn thêm 1 Cron Job bạn không cần SSH vào máy chủ và thêm các mục Cron nữa mà chỉ cần cấu hình trực tiếp trên code laravel.
Bắt tay vào việc thôi:
Tạo Cron
Đầu tiên bạn phải tạo 1 Cron duy nhất để Server chạy Laravel Schedule mỗi phút: Mở file crontab: $ sudo nano /etc/crontab Thêm dòng * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Tạo task Schedule Bạn có thể lên lịch cho tất cả các công việc của bạn trong phương thức schedule của class AppConsoleKernel.
Ví dụ: Xóa các user chưa active
<?php namespace AppConsole; use DB; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; use CarbonCarbon; class Kernel extends ConsoleKernel { protected $commands = [ AppConsoleCommandsInspire::class, ]; protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('users')->where('is_active', false)->where('created_at', '<', Carbon::now()->addWeeks(-1)->toDateTimeString())->delete(); })->daily(); } }
Ngoài việc gọi Closure ta có thể gọi Artisan commands bằng hàm command:
$schedule->command('emails:send --force')->daily();
Hoặc chạy các lệnh của hệ điều hành:
$schedule->exec('node sever.js')->daily();
Các thiết lập thời gian
Thiết lập thời gian
Method | Description |
---|---|
->cron(' *'); | chạy công việc trong custom Cron schedule |
->everyMinute(); | chạy mỗi phút 1 lần |
->everyFiveMinutes(); | chạy mỗi 5 phút 1 lần |
->everyTenMinutes(); | chạy mỗi 10 phút 1 lần |
->everyThirtyMinutes(); | chạy mỗi 30 phút 1 lần |
->hourly(); | chạy mỗi giờ 1 lần |
->daily(); | chạy mỗi ngày vào 00:00 |
->dailyAt('13:00'); | chạy mỗi ngày vào 13:00 |
->twiceDaily(1, 13); | chạy 2 lần 1 ngày vào 1:00 & 13:00 |
->weekly(); | chạy mỗi tuần 1 lần |
->monthly(); | chạy mỗi tháng 1 lần |
->yearly(); | chạy mỗi năm 1 lần |
Dưới đây là một danh sách của những hạn chế lịch trình bổ sung:
Method | Description |
---|---|
->weekdays(); | giới hạn công việc các ngày trong tuần |
->sundays(); | giới hạn công việc trong chủ nhật |
->mondays(); | giới hạn công việc trong thứ hai |
->tuesdays(); | giới hạn công việc trong thứ ba |
->wednesdays(); | giới hạn công việc trong thứ tư |
->thursdays(); | giới hạn công việc trong thứ năm |
->fridays(); | giới hạn công việc trong thứ sáu |
->saturdays(); | giới hạn công việc trong thứ bảy |
->when(Closure); | giới hạn công việc khi thỏa điều kiện |
->at('13:00'); | chạy công việc vào lúc 13h00 |
Ví dụ: Gửi mail cho các thành viên vào thứ 2 hàng tuần khi thỏa mãn 1 điều kiện nào đó
$schedule->command('emails:send')->weekly()->mondays()->when(function () { // Some code return true; });
Tham khảo
- https://laravel.com/docs/5.3/mail