Django与Amazon SES SMTP

34 投票
8 回答
25185 浏览
提问于 2025-04-17 08:43

我正在尝试在Django 1.3.1中使用亚马逊的新SMTP服务来发送邮件,但遇到了一些问题。

我已经创建了SES的SMTP凭证,并在我的设置中添加了这些信息:

EMAIL_USE_TLS = True
EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_HOST_USER = 'my-smtp-user'
EMAIL_HOST_PASSWORD = 'my-smtp-password'
EMAIL_PORT = 465

然后我尝试发送一封测试邮件(发件人和收件人都是经过验证的邮箱地址):

from django.core.mail import send_mail

send_mail('Test subject', 'This is the body', 'info@abc.com',['hello@abc.com'], fail_silently=False)

但是我收到了以下错误信息:

SMTPServerDisconnected: Connection unexpectedly closed

我可以通过telnet连接到服务器:

telnet email-smtp.us-east-1.amazonaws.com 465

8 个回答

13

2019 更新:Django 2.2.1

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'my_smtp_username'
EMAIL_HOST_PASSWORD = 'my_smtp_password'
EMAIL_USE_TLS = True

不需要任何库。

感谢来源: https://stackoverflow.com/a/32476190/5647272

参考资料: https://docs.djangoproject.com/en/2.2/topics/email/

16

2022年8月更新,使用Django-3.2.4:

不需要像 django-sesdjango-amazon-ses 这样的库!!

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'email-smtp.ap-northeast-1.amazonaws.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'my_smtp_username'      # Must create SMTP Credentials
EMAIL_HOST_PASSWORD = 'my_smtp_password'  # Must create SMTP Credentials
DEFAULT_FROM_EMAIL = 'myses@sender.com' # If don't need, comment out!!

我添加了DEFAULT_FROM_EMAIL

DEFAULT_FROM_EMAIL = 'myses@sender.com'

如果你不需要这个,可以把它注释掉!!

# DEFAULT_FROM_EMAIL = 'myses@sender.com'

另外,对于DEFAULT_FROM_EMAIL,你需要放一个已验证的域名邮箱地址,无论你的账户是否在沙盒环境中。

所以对于下面的已验证域名sender.com

在这里输入图片描述


下面这三个是有效的:(只用其中一个)

DEFAULT_FROM_EMAIL = 'abc@sender.com' # OR
DEFAULT_FROM_EMAIL = 'test@sender.com' # OR
DEFAULT_FROM_EMAIL = 'myses@sender.com'

但下面这两个是无效的:(这些会报错)

*格式必须是something@sender.com!!

DEFAULT_FROM_EMAIL = 'sender.com' 
DEFAULT_FROM_EMAIL = '@sender.com'

然后,对于下面的2个邮箱地址

在这里输入图片描述


只需使用下面的两个中的一个:

DEFAULT_FROM_EMAIL = 'hello@gmail.com' # OR
DEFAULT_FROM_EMAIL = 'world@outlook.com'

最后,对于EMAIL_HOST_USEREMAIL_HOST_PASSWORD,你必须创建SMTP凭证

选择SMTP设置

在这里输入图片描述


点击创建我的SMTP凭证按钮:

在这里输入图片描述


得到的SMTP凭证

在这里输入图片描述

然后,把SMTP凭证放在下面:

EMAIL_HOST_USER = 'AKIAWP3TMGZN4OZH5H37'
EMAIL_HOST_PASSWORD = 'BB6dufiw96jJHUTrowXI8R4gcyOI+t1+Skbi51cdHYhV'

*(我已经删除了这些SMTP凭证


32

我找到了一种更简单的方法,可以让我使用Django自带的邮件功能,这样我仍然可以收到管理员的错误邮件报告等。

多亏了这个小工具,我能够顺利使用SES SMTP:

https://github.com/bancek/django-smtp-ssl

下载并安装(运行python setup.py install)

然后只需要把你的设置改成使用这个新的邮件后端:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'

其他的设置和以前一样:

EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'my_smtp_username'
EMAIL_HOST_PASSWORD = 'my_smtp_password'
EMAIL_USE_TLS = True

撰写回答