使用Django的Amazon SES SMTP

Giv*_*ivP 28 python django smtp amazon-web-services amazon-ses

我正在尝试使用Amazon的新SMTP服务进行SES与Django 1.3.1,但我没有太多运气.

我已经创建了我的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
Run Code Online (Sandbox Code Playgroud)

然后我尝试发送测试电子邮件(来自和验证的电子邮件地址):

from django.core.mail import send_mail

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

但是我收到以下错误:

SMTPServerDisconnected: Connection unexpectedly closed
Run Code Online (Sandbox Code Playgroud)

我可以telnet到服务器:

telnet email-smtp.us-east-1.amazonaws.com 465
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

谢谢,G

Giv*_*ivP 27

感谢大家的建议,但我终于找到了一个更简单的解决方案,允许我使用Django的内置邮件类,所以我仍然可以得到我的管理错误电子邮件报告等.

感谢这个小小的美丽,我能够毫无问题地使用SES SMTP:

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

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

然后只需更改您的设置即可使用此新电子邮件后端:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
Run Code Online (Sandbox Code Playgroud)

其余设置按照正常情况进行:

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
Run Code Online (Sandbox Code Playgroud)

尼斯.

G

  • 这个答案已经过时了。您现在可以简单地使用内置的 django 配置来执行此操作。 (5认同)

小智 16

2022 年 8 月 Django-3.2.4 更新:

不需要诸如django-ses或 之类的库django-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!!
Run Code Online (Sandbox Code Playgroud)

我补充道DEFAULT_FROM_EMAIL

DEFAULT_FROM_EMAIL = 'myses@sender.com'
Run Code Online (Sandbox Code Playgroud)

如果不需要的话评论一下!!

# DEFAULT_FROM_EMAIL = 'myses@sender.com'
Run Code Online (Sandbox Code Playgroud)

此外,对于DEFAULT_FROM_EMAIL,请输入 1verified domainemail address无论您的帐户是否在 中sandbox

因此对于下面经过验证的域sender.com

在此输入图像描述


以下三个是有效的:(仅使用三个之一)

DEFAULT_FROM_EMAIL = 'abc@sender.com' # OR
DEFAULT_FROM_EMAIL = 'test@sender.com' # OR
DEFAULT_FROM_EMAIL = 'myses@sender.com'
Run Code Online (Sandbox Code Playgroud)

但下面这两个无效:(这些会给你错误)

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

DEFAULT_FROM_EMAIL = 'sender.com' 
DEFAULT_FROM_EMAIL = '@sender.com'
Run Code Online (Sandbox Code Playgroud)

那么,为了下面的验证2 email addresses

在此输入图像描述


只需使用以下两个之一:

DEFAULT_FROM_EMAIL = 'hello@gmail.com' # OR
DEFAULT_FROM_EMAIL = 'world@outlook.com'
Run Code Online (Sandbox Code Playgroud)

最后,对于EMAIL_HOST_USEREMAIL_HOST_PASSWORD,您必须创建SMTP Credentials

选择SMTP Settings

在此输入图像描述


按下Create My SMTP Credentials按钮:

在此输入图像描述


鉴于SMTP Credentials

在此输入图像描述

然后,SMTP Credentials如下所示:

EMAIL_HOST_USER = 'AKIAWP3TMGZN4OZH5H37'
EMAIL_HOST_PASSWORD = 'BB6dufiw96jJHUTrowXI8R4gcyOI+t1+Skbi51cdHYhV'
Run Code Online (Sandbox Code Playgroud)

*(我已经删除了这些SMTP Credentials



Uma*_*mad 11

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
Run Code Online (Sandbox Code Playgroud)

不需要图书馆。

学分: https //stackoverflow.com/a/32476190/5647272

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


Edw*_*ndo 9

在Django 1.7中,您可以在没有第三方库的情况下本地发送带有SSL的电子邮件.

EMAIL_USE_SSL = True
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/1.7/ref/settings/#std:setting-EMAIL_USE_SSL


vsv*_*sya 5

经过长时间的搜索和尝试,我发现:

而是使用:

 s = smtplib.SMTP(host, port)
 s.starttls()
 s.login(user, password)
Run Code Online (Sandbox Code Playgroud)

对于AmazonSES,SMTP必须是:

 s = smtplib.SMTP_SSL(host, port)
 s.login(user, password)
Run Code Online (Sandbox Code Playgroud)

因此,我认为,对于django,您可以修复django代码,或者编写自己的简单电子邮件后端[基于默认的django电子邮件后端].

UPD:

我找到了另一个解决方案(但我自己没有测试过):从下面的链接中使用SSLEmailBackend

// settings.py
EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend'
Run Code Online (Sandbox Code Playgroud)

(从这里:与Django + uWSGI +发送电子邮件的神秘问题)

UPD2:

AmazonSES从现在开始支持STARTTLS :)

Amazon SES支持SMTP的扩展附件类型,VERP和STARTTLS

(来自亚马逊通讯)