已配置AWS SES的Django项目,如何在Shell中成功发送邮件?
问题排查与解决方案
一、确认本地环境配置正确性
网站能正常发邮件,但本地脚本不行,首先要确认本地加载的Django配置是否和线上一致:
- 启动shell_plus时打印配置验证:
from django.conf import settings print(settings.EMAIL_BACKEND) print(settings.ANYMAIL)
检查输出的EMAIL_BACKEND是否为anymail.backends.amazon_ses.EmailBackend,以及ANYMAIL里的AWS密钥、区域是否和线上配置完全一致。如果本地用了开发环境配置(比如settings_dev.py),需指定生产环境配置启动shell:
python manage.py shell_plus --settings=你的项目名.settings.production
二、排查AWS SES侧的发送问题
即使send_mail返回1,也不代表邮件一定能投递到收件箱,需检查以下点:
- 沙箱模式限制:如果你的SES账户还在沙箱中,发件人和收件人都必须是已验证的邮箱/域名。确认收件邮箱
me@mysite.com是否已在SES中验证(域名验证后,该域名下的邮箱默认允许,但沙箱环境下需确保收件人也是验证过的)。 - 垃圾邮件文件夹:直接去收件邮箱的垃圾/归档文件夹查找,SES发送的邮件偶尔会被归类为垃圾邮件。
- SES投递日志:登录AWS控制台进入SES,通过「邮件查询」功能搜索对应邮件,查看投递状态、错误信息(比如拒收、退回原因)。
三、本地终端发送邮件的可行方案
方案1:用指定配置的shell_plus发送
确保加载正确的配置文件后执行发送代码:
# 替换为你的项目配置路径 python manage.py shell_plus --settings=your_project.settings.production
在shell中执行:
from django.core.mail import send_mail # 打开fail_silently=False,发送失败会抛出异常,方便排查 send_mail("测试邮件", "本地脚本测试内容", "me@mysite.com", ["me@mysite.com"], fail_silently=False)
方案2:编写独立本地脚本
创建send_test_email.py文件,内容如下:
import os import django # 设置Django配置模块路径,替换为你的项目实际路径 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings.production") django.setup() from django.core.mail import send_mail try: send_mail( "本地脚本测试邮件", "这是通过本地脚本发送的测试邮件", "me@mysite.com", ["me@mysite.com"], fail_silently=False, ) print("邮件发送请求已提交,请查收") except Exception as e: print(f"发送失败:{str(e)}")
终端执行脚本:
python send_test_email.py
如果发送失败,会直接打印错误信息,帮你快速定位问题(比如密钥无效、权限不足等)。
四、额外注意事项
- AWS密钥权限:确保本地使用的AWS密钥拥有SES发送权限,可附加
AmazonSESFullAccess策略,或更精细的ses:SendEmail、ses:SendRawEmail权限。 - 网络问题:本地若有代理,可能影响SES API调用,尝试关闭代理后再测试。
- 发件人地址:必须使用SES已验证域名下的地址作为发件人,不能用未验证的域名。
内容的提问来源于stack exchange,提问作者RobMcC
相关产品推荐
相关产品推荐

