django-ses模块连接超时:使用django.core.mail发送邮件失败
解决django-ses连接AWS SES超时问题
问题原因
你使用的django_ses.SESBackend是通过AWS SES REST API发送邮件,而非SMTP协议,但你配置的AWS_SES_REGION_ENDPOINT是SMTP服务的地址,导致botocore尝试通过HTTPS连接SMTP端口,最终超时。而你直接用smtplib是走SMTP协议,所以能正常发送。
解决方案一:修正django-ses API模式配置
修改settings.py中的配置,使用SES API的正确endpoint,移除无效的AWS_SES_USER配置(django-ses中无此参数):
EMAIL_BACKEND = 'django_ses.SESBackend' AWS_SES_ACCESS_KEY_ID = '-my-access-key-' AWS_SES_SECRET_ACCESS_KEY = '-my-secret-access-key-' AWS_SES_REGION_NAME = 'eu-central-1' # 替换为SES API的endpoint,而非SMTP地址 AWS_SES_REGION_ENDPOINT = 'email.eu-central-1.amazonaws.com' # 可选:设置默认发件人,调用时也可手动指定from_email AWS_SES_FROM_EMAIL = 'my-verified@email'
调用代码保持不变即可:
from django.core.mail import EmailMessage email = EmailMessage(subject, message, from_email='my-verified@email', recipient_list) email.content_subtype = 'html' email.send()
解决方案二:改用Django原生SMTP后端
如果你更倾向于用SMTP协议(和你测试的smtplib方式一致),可以直接使用Django自带的SMTP后端,无需依赖django-ses:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'email-smtp.eu-central-1.amazonaws.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '-my-access-key-' EMAIL_HOST_PASSWORD = '-my-secret-access-key-' DEFAULT_FROM_EMAIL = 'my-verified@email'
调用代码同样保持不变,Django会自动通过SMTP发送邮件。
额外检查点
- 确认你的AWS IAM用户拥有
ses:SendEmail或ses:SendRawEmail权限(API模式需要) - 确认服务器网络可以访问AWS SES的API端口(443)或SMTP端口(587/465),无防火墙/代理拦截
内容的提问来源于stack exchange,提问作者Domenico Spidy Tamburro
相关产品推荐
相关产品推荐

