Lỗi Gặp Phải
Bạn gửi email qua AWS SES và nhận ngay phản hồi này:
MessageRejected: Email address is not verified. The following identities failed the check in region US-EAST-1: recipient@example.com
Địa chỉ người gửi của bạn hoạt động bình thường. Thông tin xác thực cũng không có vấn đề gì. Vậy mà SES vẫn từ chối toàn bộ email gửi đi. Đó chính là Sandbox đang làm đúng nhiệm vụ của nó — chỉ tiếc là đang chống lại bạn.
Nguyên Nhân
Mọi tài khoản AWS mới đều bắt đầu với SES bị khóa trong chế độ Sandbox. Ở chế độ này, SES chỉ cho phép gửi đến các địa chỉ email hoặc tên miền mà bạn đã xác minh tường minh — không có người nhận tùy ý, không có ngoại lệ.
Sandbox cũng giới hạn bạn ở mức 200 email mỗi ngày và 1 tin nhắn mỗi giây. Lỗi xuất hiện khi bất kỳ điều kiện nào sau đây xảy ra:
- Địa chỉ người nhận chưa được xác minh trong SES
- Bạn vẫn đang ở Sandbox và chưa yêu cầu quyền truy cập production
- Identity của bạn được xác minh ở một region (ví dụ:
us-east-1) nhưng bạn lại gửi qua region khác (ví dụ:eu-west-1)
Cách Sửa 1: Yêu Cầu Quyền Truy Cập Production (Khuyến Nghị)
Đối với bất kỳ ứng dụng thực tế nào, đây là cách sửa bạn nên chọn. Quyền truy cập production gỡ bỏ giới hạn người nhận phải xác minh và nâng hạn mức gửi của bạn lên 50.000 email/ngày theo mặc định.
- Vào AWS Console → SES → Account Dashboard
- Nhấn Request production access
- Điền vào biểu mẫu: trường hợp sử dụng, khối lượng dự kiến, cách bạn xử lý bounce và complaint
- Gửi — AWS thường xét duyệt yêu cầu trong vòng 24 giờ, dù các trường hợp phức tạp có thể mất lâu hơn
Muốn dùng CLI? Gửi yêu cầu trực tiếp:
aws sesv2 put-account-details \
--mail-type TRANSACTIONAL \
--website-url https://yourapp.com \
--use-case-description "Sending transactional emails (password reset, order confirmation) to registered users who opted in" \
--additional-contact-email-addresses your@email.com \
--production-access-enabled \
--region us-east-1
Kiểm tra xem tài khoản của bạn đã được phê duyệt chưa:
aws sesv2 get-account --region us-east-1
Tìm "ProductionAccessEnabled": true trong kết quả trả về. Nếu hiển thị false, yêu cầu vẫn đang chờ xử lý hoặc chưa được gửi.
Cách Sửa 2: Xác Minh Email Người Nhận (Nhanh cho Mục Đích Kiểm Thử)
Vẫn đang chờ quyền truy cập production? Hãy xác minh các địa chỉ cụ thể mà bạn cần kiểm thử. SES sẽ gửi link xác minh đến hộp thư đó — sau khi nhấp vào, địa chỉ đó có thể nhận email trong Sandbox.
# Xác minh địa chỉ email người nhận
aws ses verify-email-identity \
--email-address recipient@example.com \
--region us-east-1
Kiểm tra tất cả identity đã được xác minh hiện tại:
aws ses list-identities --region us-east-1
Cần xác nhận một địa chỉ cụ thể đã được xác minh trước khi gửi không?
aws ses get-identity-verification-attributes \
--identities recipient@example.com \
--region us-east-1
Địa chỉ đã xác minh sẽ trả về kết quả như sau:
{
"VerificationAttributes": {
"recipient@example.com": {
"VerificationStatus": "Success"
}
}
}
Bất kỳ giá trị nào khác ngoài Success — chẳng hạn Pending — có nghĩa là người nhận chưa nhấp vào link xác minh.
Cách Sửa 3: Xác Minh Toàn Bộ Tên Miền
Xác minh từng địa chỉ một rất mất thời gian. Thay vào đó hãy xác minh cả tên miền — mọi địa chỉ thuộc tên miền đó sẽ tự động trở thành người nhận hợp lệ trong chế độ Sandbox.
# Lấy bản ghi TXT để thêm vào DNS của bạn
aws ses verify-domain-identity \
--domain example.com \
--region us-east-1
AWS trả về một token xác minh. Thêm nó dưới dạng bản ghi TXT trong nhà cung cấp DNS của bạn:
_amazonses.example.com TXT "your-verification-token-here"
DNS propagation thường mất vài phút đến vài giờ. Kiểm tra trạng thái xác minh sau khi propagation hoàn tất:
aws ses get-identity-verification-attributes \
--identities example.com \
--region us-east-1
Cách Sửa 4: Lỗi Sai Region
Identity trong SES được giới hạn theo từng region. Xác minh tên miền ở us-east-1 sẽ không có tác dụng gì với các yêu cầu gửi qua eu-west-1 — bạn vẫn gặp lỗi MessageRejected dù trông như xác minh đã thành công trong console.
Đảm bảo code của bạn trỏ đúng region nơi identity của bạn thực sự tồn tại:
import boto3
# region_name phải khớp với nơi identity của bạn được xác minh
client = boto3.client('ses', region_name='us-east-1')
response = client.send_email(
Source='verified-sender@yourdomain.com',
Destination={'ToAddresses': ['recipient@example.com']},
Message={
'Subject': {'Data': 'Test'},
'Body': {'Text': {'Data': 'Hello'}}
}
)
So sánh những gì đã được xác minh ở các region để phát hiện sự không khớp:
aws ses list-identities --region us-east-1
aws ses list-identities --region eu-west-1
Xác Nhận Đã Sửa Thành Công
Gửi email kiểm thử trực tiếp từ CLI — cách nhanh nhất để xác nhận mọi thứ đã hoạt động:
aws ses send-email \
--from "sender@yourdomain.com" \
--destination "ToAddresses=recipient@example.com" \
--message "Subject={Data=Test,Charset=UTF-8},Body={Text={Data=It works,Charset=UTF-8}}" \
--region us-east-1
Thành công sẽ trông như thế này:
{
"MessageId": "0100018e1234abcd-..."
}
Không còn MessageRejected nghĩa là bạn đã xong.
Phòng Tránh
- Gửi yêu cầu quyền truy cập production sớm. Đừng đợi đến ngày ra mắt. Hãy nộp ngay khi bạn thiết lập SES — phê duyệt không diễn ra ngay lập tức, và bị chặn trong lúc deploy production là điều rất đau đầu.
- Dùng địa chỉ SES simulator trong các bài kiểm thử tự động. AWS cung cấp các địa chỉ như
success@simulator.amazonses.comvàbounce@simulator.amazonses.comhoạt động trong Sandbox mà không cần xác minh và không tính vào hạn mức 200 email/ngày. - Thiết lập thông báo bounce và complaint qua SNS trước khi đưa vào production. AWS yêu cầu điều này để cấp quyền truy cập production, và bỏ qua sau khi được phê duyệt sẽ đặt danh tiếng người gửi của bạn vào nguy hiểm — quá nhiều complaint có thể khiến tài khoản bị đình chỉ.
- Mỗi region mới là một khởi đầu mới. Mở rộng sang
ap-southeast-1hoặc bất kỳ region nào khác đồng nghĩa với việc phải xác minh lại tên miền và nộp yêu cầu quyền truy cập production riêng cho region đó.

