Devlog/2025-11-08/3 phút
v1

Gửi email bằng AWS SES.

Việc gửi email bằng AWS SES có thể phức tạp hơn một chút lúc ban đầu, nhưng bù lại là độ tin cậy cao, khả năng mở rộng tốt

#aws ses#email
fig.01 — outbound.svgses:SendEmail

§1Bối cảnh

Sau một thời gian sử dụng Gmail SMTP để gửi email cho các hệ thống, nay mình quyết định chuyển sang sử dụng AWS SES.

Mình cũng cân nhắc lựa chọn khác là SendGrid, tuy nhiên vì vấn đề giá nên mình đã quyết định sử dụng SES.

§2Cài đặt

1. Kích hoạt SES

Trước hết chúng ta sẽ vào AWS Console → SES để thiết lập. Chú ý là chọn khu vực (region) muốn sử dụng, ở đây mình chọn ap-southeast-1.

Quá trình thiết lập khá dễ dàng, chỉ cần thực hiện theo các bước. Mình sẽ cần cung cấp 1 email và một domain.

Sau khi quá trình thiết lập hoàn tất thì AWS show cho chúng ta các bước phải làm tiếp theo:

  1. Xác minh email: chỉ cần check email và click và link để xác minh
  2. Xác minh domain: AWS sẽ show cho chúng ta các bản ghi DNS, chúng ta copy sang domain provider là được, sẽ mất vài phút để việc xác minh được hoàn tất.

Ban đầu, tài khoản SES thường ở sandbox mode, chỉ gửi được tới các địa chỉ đã xác minh. Sau quá trình testing, chúng ta có thể gửi yêu cầu "Production access" trong phần Account dashboard → Sending limits để gỡ giới hạn này.

2. Tạo IAM Policy và Access Key

Bây giờ chúng ta cần tạo một user và tạo một cặp key để sử dụng trong app của chúng ta.

  1. Vào IAM → Users → Create user.

  2. Gán policy sau cho user: đoạn này mình muốn tìm policy có sẵn chỉ cung cấp quyền gửi email và lấy dữ liệu thống kê email, tuy nhiên mình không tìm thấy policy như vậy. Nên mình đã tạo một policy mới:

    json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ses:SendEmail",
            "ses:SendRawEmail",
            "ses:GetSendQuota",
            "ses:GetSendStatistics"
          ],
          "Resource": "*"
        }
      ]
    }

    Nếu muốn chặt hơn, có thể thay "Resource": "*" bằng ARN của identity (domain hoặc email) đã xác minh.

  3. Sau khi tạo user, chọn Security credentials → Create access key. Lưu lại Access Key ID và Secret Access Key, cặp thông tin chúng ta sẽ dùng trong ứng dụng.

§3Triển khai

Cài đặt AWS SDK

bash
npm install @aws-sdk/client-ses

Tạo module gửi email

js
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";

// SDK tự đọc AWS_ACCESS_KEY_ID và AWS_SECRET_ACCESS_KEY từ biến môi trường
const ses = new SESClient({ region: "ap-southeast-1" });

export async function sendEmail({ to, subject, html }) {
  const params = {
    Source: "[email protected]",
    Destination: {
      ToAddresses: [to],
    },
    Message: {
      Subject: { Data: subject },
      Body: { Html: { Data: html } },
    },
  };

  try {
    await ses.send(new SendEmailCommand(params));
    console.log("✅ Email sent to", to);
  } catch (err) {
    console.error("❌ Email send failed:", err);
    throw err;
  }
}

Mình throw lại lỗi sau khi log để nơi gọi biết là gửi thất bại, thay vì lặng lẽ bỏ qua.

Gọi trong ứng dụng

js
await sendEmail({
  to: "[email protected]",
  subject: "Welcome to MyApp!",
  html: "<h1>Hello 👋</h1><p>Thanks for joining!</p>",
});

§4Kết luận

AWS SES cài đặt ban đầu phức tạp hơn một chút, đặc biệt là ở bước xác minh domain và cấu hình DNS. Bù lại, SES đáng tin cậy, chi phí thấp và mở rộng tốt.

Trạm Dev · 2025-11-08 · v1 · EOF
#aws ses#email
$ ls ./devlog6 / 7