Bố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.
Cà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:
- Xác minh email: chỉ cần check email và click và link để xác minh
- 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.
- Vào IAM → Users → Create user.
- 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.
- Sau khi tạo user, chọn Security credentials → Create access key.
Lưu lạiAccess Key IDvàSecret Access Key— đây là cặp thông tin chúng ta sẽ dùng trong ứng dụng.
Triển khai
Cài đặt AWS SDK
npm install @aws-sdk/client-sesTạo module gửi email
import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({
region: "ap-southeast-1",
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
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);
}
}Gọi trong ứng dụng
await sendEmail({
to: "[email protected]",
subject: "Welcome to MyApp!",
html: "<h1>Hello 👋</h1><p>Thanks for joining!</p>",
});Kết luận
Việc gửi email bằng AWS SES có thể phức tạp hơn một chút khi cài đặt ban đầu (đặc biệt là xác minh domain và cấu hình DNS), nhưng bù lại là độ tin cậy cao, chi phí thấp và khả năng mở rộng tốt.