使用Python+AWS SES发送邮件无报错但未送达,求排查帮助
Django AWS SES邮件发送成功但未送达排查方案
1. 检查AWS SES账户状态
- 新注册的AWS SES账户默认处于沙盒模式,仅允许向已在SES控制台验证过的邮箱/域名发送邮件,先确认收件邮箱是否完成验证
- 发件邮箱
AWS_SES_SENDER_MAIL必须是SES中已验证的身份,核对配置值与SES控制台的验证记录是否一致
2. 验证环境变量与权限配置
- 打印或通过Django Shell输出
AWS_ACCESS_KEY、AWS_KEY_ID、AWS_SES_REGION等变量,确认环境变量是否正确加载 - 检查IAM用户权限:必须拥有
ses:SendEmail或ses:SendRawEmail权限,且无额外限制策略
3. 排查邮件内容与收件方拦截
- 当前使用纯文本邮件,检查是否包含特殊字符、敏感内容导致被收件方反垃圾系统拦截,可先发送极简内容(如"Test Email")测试
- 确认收件邮箱是否将发件地址归入垃圾邮件箱,检查垃圾箱或反垃圾设置
4. 查看AWS SES官方日志
- 登录AWS控制台进入SES服务,查看发送统计和邮件活动面板,里面会显示邮件的具体状态(已投递、被退回、被拒绝等)
- 退信记录会明确标注失败原因(如收件地址无效、域名拒收、SPF/DKIM配置问题等)
5. 验证Django SES后端配置
- 确认
django-amazon-ses包版本与当前Django版本兼容,过时版本可能存在隐性bug - 尝试替换为Django原生SMTP后端测试,排除第三方包问题:
# settings.py 临时配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = f'email-smtp.{AWS_SES_REGION}.amazonaws.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = AWS_KEY_ID EMAIL_HOST_PASSWORD = AWS_ACCESS_KEY DEFAULT_FROM_EMAIL = AWS_SES_SENDER_MAIL
6. 本地Shell测试发送逻辑
- 在Django Shell中手动执行发送代码,查看是否有隐藏错误(接口无报错但Shell可能输出更详细日志):
from django.core.mail import send_mail from django.conf import settings send_mail( "Test Subject", "Test Message", settings.AWS_SES_SENDER_MAIL, ["your-test-email@example.com"], fail_silently=False )
内容的提问来源于stack exchange,提问作者user28276198
相关产品推荐
相关产品推荐

