Skip to content

Blog Công Nghệ

MENUMENU
  • Trang chủ
  • Giới Thiệu
  • Lập Trình
    • Lập Trình Website
      • Laravel
        • Phân Tích Dự Án
      • PHP
      • SQL
      • HTML
      • CSS
      • Javascipt
      • My Project
      • Wordpress
    • Luyện Skill
    • Lập trình winform
    • CSDL
    • Lập Trình Android
    • Trí tuệ nhân tạo
    • Khai Khoáng Dữ Liệu
    • Arduino
    • Khác
    • Đồ án
  • Phần Mềm
    • Powerpoint
    • Tool
  • Cuộc sống và Giải trí
    • Hợp âm
    • web5ngay - youtube
    • Công Giáo
    • Kỹ Năng Sống
    • Street Workout
  • Danh sách bài viết
  • Guide line
    • Guild line phỏng vấn
    • Guide lines Laravel
    • Guide line Module Frontend
  • Tóm tắt sách
  • Fanpage

Blog Công Nghệ

Nơi chia sẻ kiến thức

Sendmail trong Laravel sử dụng dịch vụ SES, SQS của Amazon

10 Tháng Ba, 2025 by admin
Lượt xem: 16

Contents

  • 1. Dịch vụ SES là gì?
  • 2. Gửi mail với Laravel và SES
    • 2.1 Cấu hình trên AWS-SES
    • 2.2 Cấu hình sendmail và gửi email trong Laravel
    • 2.3 Những điều cần thiết để có thể chạy trên server
      • 2.3.1 Queue
      • 2.3.2 Supervisor
  • 3. Tracking mail SES dễ dàng
  • Kết luận

1. Dịch vụ SES là gì?

SES (Simple Email Service) là một dịch vụ gửi mail được Amazon cung cấp, nhằm tiết kiệm chi phí, linh hoạt và dễ dàng thay đổi quy mô, cho phép nhà phát triển gửi email từ bên trong ứng dụng bất kỳ.

Các ưu điểm khi sử dụng dịch vụ SES:

  • Gửi mail số lượng lớn phù hợp với nhu cầu của doanh nghiệp.
  • Tốc độ gửi mail nhanh, server phân bố rộng trên toàn cầu.
  • Tiết kiêm chi phí (1$/1000 email)
  • Dễ dàng mở rộng quy mô
  • Dễ dàng kết hợp với các dịch vụ khác trong hệ sinh thái amazon như: Cloudwatch, Simple Notification Service (SNS)

2. Gửi mail với Laravel và SES

2.1 Cấu hình trên AWS-SES

Trước tiên, bạn cần có tài khoản AWS để có thể sử dụng dịch vụ SES. Trong phạm vi bài này mình không đề cập cách tạo tài khoản, các bạn có thể tham khảo thêm tại:

  1. https://beginaws.awsstudygroup.com/vi/1-account-setup/1-create-new-aws-account/
  2. https://cuongquach.com/aws-dang-ky-tai-khoan-aws-free-tier-mien-phi.html

Khi đã có tài khoản hãy đăng nhập vào dashboard quản trị của Amazon tại đây.

Tiếp theo hãy chọn phân vùng phù hợp. 

Lưu ý: hiện tại SES chỉ được Amazon cung cấp ở 3 phân vùng: N.Virginia , Oregon và Ireland. Ở các phân vùng khác không sử dụng được.

Tiếp tục nhé, bạn cần tạo một SMTP Credential

  • Hãy vào SES Services =>  Account dashboard => Create SMTP credentials

Sau đó bạn sẽ được chuyển đến màn hình tạo IAM, nhiệm vụ lúc này chỉ cần click vào nút create trên màn hình để tạo IAM thôi.

Khi đó, bạn sẽ được cấp SMTP Username và SMTP Password, hãy lưu lại hai thông tin này để có thể dùng trong ứng dụng của bạn nhé! Nhấn “Download Credentials” cho chắc luôn nha, vì chỉ cấp một lần thôi đấy!

Hãy quay lại màn hình dashboard để lấy thêm thông tin host nhé!

  • Hãy vào SES Services =>  Account dashboard

Như vậy là đã đủ thông tin cho ứng dụng của bạn kết nối vào rồi đấy!

Mà khoan, có một lưu ý bạn cần biết: mặc định khi bạn tạo SES của bạn sẽ nằm trong Sandbox, tức là bạn không thể gửi mail ra bên ngoài cho bất kỳ email nào, điều này SES muốn bạn trong quá trình develop không bị gửi nhầm cho một email nào đó, khá hay đúng không? Vậy làm sao để gửi được mail?

Có 2 cách để bạn có thể gửi được mail:

+ Cách 1: Yêu cầu AWS mở Sandbox cho bạn, điều này bạn cần request cũng như nêu lý do để Amazon đồng ý mở Sandbox cho bạn. Tất nhiên điều này chỉ khi nào release ứng dụng của bạn thì mới phải làm cách này.

+ Cách 2: Thêm email/domain vào để xác nhận với Amazon, email/domain đó là của tôi và tôi muốn gửi đến nó.

Cách thêm email như sau:

  • Hãy vào SES Services =>  Verfied Identities => Create Identity

Ở đây mình đã verify nhiều email, nếu bạn chưa verify thì nội dung trong bảng sẽ không có nhé!

Tiếp thôi, bạn hãy chọn Email address, nhập thông tin email và nhấn Create Identity

Khi đó, một email gửi đến hộp mail để xác nhận email trên. Nếu bạn quay lại màn hình Verfied Identities sẽ thấy email của bạn đang ở trạng thái Verification pending

Lúc này khi mở mail bạn sẽ thấy một mail từ Amazon.

Hãy mở mail và click vào link đính kèm trong nội dung để xác nhận nhé!

Khi xác nhận thành công, bạn sẽ nhận được màn hình này.

Nếu bạn quay lại màn hình Verfied Identities sẽ thấy email của bạn đang ở trạng thái Verified

Như vậy đã thêm mail vào được rồi, lúc này bạn có thể gửi mail cho người này bất cứ lúc nào. Tuy nhiên lưu ý mỗi ngày bạn sẽ có 200 email miễn phí để gửi test thôi nhé, khi nào mở Sandbox thì giới hạn sẽ là 50.000 emails/ ngày.

Tiếp theo là gì nhỉ? Chắc chắn là test xem gửi email đến email đó được chưa đúng không?

Click checkbox mail và chọn Send test email nhé!

Bạn sẽ được chuyển sang màn hình input sendmail:

  • Chọn Formatted
  • Scenario hãy chọn Custom
  • Custom recipient hãy nhập email đã verify. Vì ở đây chỉ có 1 email được verify nên khi gửi mail là email sẽ tự gửi cho chính email đó.
  • Nhập subject và body tùy ý để test sendmail
  • Cuối cùng nhấn nút Send test email

Bạn sẽ nhận được màn hình trông như thế này:

Hãy vào hộp mail, bạn đã nhận được mail rồi đúng không? Easy nhỉ?

2.2 Cấu hình sendmail và gửi email trong Laravel

Ở bước trên bạn đã có host, username, password và email verify. Hãy thay thế vào code bên dưới, sau đó bỏ vào file .env nhé! (from_name đặt tùy bạn nhé)

MAIL_DRIVER=smtp
MAIL_HOST=host
MAIL_PORT=587
MAIL_USERNAME=username
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=email_verify
MAIL_FROM_NAME=from_name

Vào routes/web.php để tạo thêm route

Route::get('/test-sendmail', 'SendmailController@send');

Tiếp theo tạo controller và phương thức send

php artisan make:controller SendmailController
<?php

namespace App\Http\Controllers\Frontend;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class SendmailController extends Controller
{
    public function send() {
        $subject = "Test sendmail Laravel";
        $email = "tronghao@gmail.com";
        $mailer['from'] = env('MAIL_FROM_ADDRESS');
        \Mail::raw('Test content', function($message) use ($email, $subject, $mailer) {  
            $message->from($mailer['from']);    
            $message->to($email)->subject($subject);
        });

        echo "Send mail successfull";
    }
}

Tiếp theo start serve lên bằng lệnh php artisan serve. Sau đó chạy đường dẫn 127.0.0.1:8000/test-sendmail

Khi đó bạn sẽ nhận được màn hình như sau.

Kiểm tra thư của bạn sẽ nhận được một email gửi từ ứng dụng Laravel của bạn.

Như vậy bạn đã kết nối và gửi được mail trong Laravel sử dụng dịch vụ SES của Amazon, tuy nhiên trong thực tế email cần đưa vào hàng đợi để giảm thời gian chờ khi gửi với số lượng email lớn. Cách làm thế nào bạn hãy tiếp tục cùng tôi ở phần tiếp theo nhé!

2.3 Những điều cần thiết để có thể chạy trên server

2.3.1 Queue

2.3.2 Supervisor

Việc cài đặt supervisor trên linux mình không đề cập trong bài viết này, các bạn có thể tham khảo thêm nhé.

Khi đã cài đặt thành công, hãy vào file config của supervisor có dạng supervisord.d/xxx.ini setting lại dòng 3 thành lệnh queue:work sqsfifo

[program:queue-worker]
process_name=test
command=php /var/www/project/artisan queue:work sqsfifo --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/project/storage/logs/queue.log
stopwaitsecs=3600

Lưu ý: Nếu thay đổi số lượng process bạn hãy làm các bước dưới đây để có thể apply thay đổi.

Ví dụ từ 2 process chuyển xuống 1 process

1.       Chạy lệnh supervisorctl status  (vẫn còn 2 process)

2.       Chạy lệnh supervisorctl reread

3.       Chạy lệnh supervisorctl stop all

4.       Chạy lệnh supervisorctl update

5.       Chạy lệnh supervisorctl status  (chỉ còn 1 process)

6.       Restart supervisor bằng lệnh: supervisorctl restart all

Tham khảo: https://mhmdomer.com/setting-up-laravel-queue-workers-using-supervisor

3. Tracking mail SES dễ dàng

Để tạo tracking mail, trước tiên bạn hãy tạo Configuration sets.

  • Hãy vào SES Services => Configuration sets => Create set

Sau đó, nhập tên configuration set và nhấn Create set 

Như vậy là bạn đã tạo configuration set thành công.

Tiếp theo hãy nhấn vào tên của configuration set vừa tạo, vào tab Event destinations => chọn Add destination

Check vào opens và nhấn Next

Chọn Amazon SNS và đặt tên Distionation

Nhất Create SNS topic

Sau khi tạo xong, chọn topic vừa tạo và nhấn next

Chọn Add destination ở màn hình tiếp theo.

Tiếp tục nhé, vào SNS service (Simple Notification Service) bằng cách search trên thanh tìm kiếm, chọn Topics và nhấn vào tên của Topics vừa tạo lúc nãy.

Chọn Create subscription

Tiếp theo hãy làm các bước sau:

  • Chọn Protocol tương ứng, ở đây tôi chọn là HTTPS
  • Nhập Endpoint chính là đường dẫn bạn sẽ đăng ký với Amazon rằng khi có sự kiện mở mail hãy báo cho tôi qua endpoint này.
  • Nhấn Create subscription

Hãy quay lại SNS service (Simple Notification Service) => chọn Topics và nhấn vào tên của Topics bạn sẽ thấy một subscription đang ở trạng thái Pending confirmation. Lúc này bạn cần xác nhận Endpoint đó là của bạn bằng cách check chọn vào subscription và nhấn Request confirmation

Ở đây mình không đề cập đến việc tạo một endpoint route trong Laravel, vì nó tương tự như mục 2.2 nên phần này mình không đi chi tiết.

Trong function xử lý tracking của bạn hãy thêm vào đoạn mã này.

/**
* Tracking mail open from response SNS
*/
public function trackingMailOpen(Request $request)
{
  try {
    $data = $request->json()->all();
    if ($request->json('Type') == 'SubscriptionConfirmation') {
      Log::info($data);
    }
  }
  catch (\Exception $e) {
    return $this->jsonCatchException($e->getMessage());
  }
}

Đoạn mã này sẽ log ra cho bạn response để Confirm subscription, dữ liệu log được lưu trong thư mục storage/logs của Laravel. Trong response bạn sẽ có dạng sau:

array (
  'Type' => 'SubscriptionConfirmation',
  'MessageId' => 'xxx',
  'Token' => 'xxx',
  'TopicArn' => 'xxx',
  'Message' => 'xxx',
  'SubscribeURL' => 'xxx',
  'Timestamp' => '2022-11-17T16:01:23.001Z',
  'SignatureVersion' => '1',
  'Signature' => 'xxx',
  'SigningCertURL' => 'https://xxx',
)  

Hãy copy value của SubscribeURL và làm tiếp các bước bên dưới để Confirm subscription.

Sau khi có SubscribeURL hãy check chọn subscription cần xác nhận và chọn Confirm subscription

Nhập url copy từ response vào và nhấn Confirm subscription

Khi đó trạng thái sẽ chuyển thành Confirmed.

Như vậy là đã xong, khi có sự kiện mở mail, Amazon sẽ gửi request đến endpoint mà bạn đã đăng ký.

Chúng ta cùng thêm đoạn code sau vào hàm xử lý tracking mail lúc nãy nhé!

/**
* Tracking mail open from response SNS
*/
public function trackingMailOpen(Request $request)
{
  try {
    $data = $request->json()->all();
    if ($request->json('Type') == 'SubscriptionConfirmation') {
      Log::info($data);
    }

    if ($request->json('Type') == 'Notification') {
      $message = $request->json('Message');
      $message = json_decode($message, true);

      switch (isset($message['eventType']) ? $message['eventType'] : null) {
        case 'Open':
				// handle tracking open mail here
          break;
        default:
          // Do Nothing
          break;
      }
    }
  }
  catch (\Exception $e) {
    return $this->jsonCatchException($e->getMessage());
  }
}

Bạn có thể viết logic xử lý tracking mở mail của bạn ở dòng 18.

Amazon trả về rất nhiều thông tin như email, userAgent, ipAddress, timestamp,…  Tất cả dữ liệu sẽ nằm trong biến $message với properties là open ($message[‘open’]) nhé!

Cuối cùng, hãy thêm vào lúc gửi mail header có configuration set của bạn. Thay value của X-SES-CONFIGURATION-SET thành tên bạn đã đặt lúc tạo nhé!

\Mail::raw('Test content', function($message) use ($email, $subject, $mailer) {  
  $message->getHeaders()->addTextHeader('X-SES-CONFIGURATION-SET', 'SendEmail');
  $message->from($mailer['from']);    
  $message->to($email)->subject($subject);
});

Kết luận

Trên đây là những chia sẻ của tôi về gửi mail bằng dịch vụ SES của Amazon, bên cạnh đó cho thấy được sự kết hợp các dịch vụ khác của Amazon một cách dễ dàng, cụ thể là SQS, từ đó cả tôi và bạn đều nhận ra rằng các dịch vụ Amazon cung cấp không cứng nhắc mà linh hoạt, dễ dàng kết hợp lẫn nhau. Đồng thời, SES cung cấp thêm tính năng tracking mail open sẽ giúp bạn có một số liệu chính xác cho mục đích của module bạn đang thực hiện cũng như doanh nghiệp của bạn. Mong là bài viết này sẽ hữu ích cho các bạn khi tìm hiểu và ứng dụng gửi mail bằng dịch vụ của Amazon.

Trên đây là những chia sẻ của tôi về gửi mail bằng dịch vụ SES của Amazon cũng như một tính năng khá hay mà SES cung cấp đó là tracking mail open, nó sẽ giúp bạn có một số liệu chính xác cho mục đích của module bạn đang thực hiện cũng như doanh nghiệp của bạn. Mong là bài viết này sẽ hữu ích cho các bạn khi tìm hiểu và ứng dụng gửi mail bằng dịch vụ của Amazon.

Related posts:

  1. Thời sinh viên làm sao để bức phá dẫn đầu – thầy Nguyễn Hoàng Khắc Hiếu
  2. Kinh nghiệm SASS – SCSS
  3. Tích hợp google translate API
  4. Code chơi

Post navigation

Previous Post:

Install SSL in Nginx Ubuntu

Next Post:

Master typescript

Trả lời Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Ẩn sidebar

Tìm kiếm

Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages

Blog Công Nghệ

Bài viết mới

  • Master typescript
  • Sendmail trong Laravel sử dụng dịch vụ SES, SQS của Amazon
  • Install SSL in Nginx Ubuntu
  • Docker study
  • Bảo vệ: Hướng dẫn code bot Telegram easy game

Lượng truy cập

0074460
Visit Today : 56
Visit Yesterday : 178
This Month : 731
Who's Online : 7
© 2025 Blog Công Nghệ | WordPress Theme by Superbthemes