亚马逊SES SMTP与Django

flvlnr44  于 2023-02-10  发布在  Go
关注(0)|答案(8)|浏览(200)

我尝试在Django1.3.1中使用Amazon新的SES 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
yqlxgs2m

yqlxgs2m1#

我发现了一个简单得多的解决方案,它允许我使用Django内置的邮件类,这样我仍然可以得到我的管理错误邮件报告等。
多亏了这个小美人,我能够使用SES SMTP没有任何问题:
https://github.com/bancek/django-smtp-ssl
下载并安装(pythonsetup.py安装)
然后只需更改您的设置即可使用此新的电子邮件后端:

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
3yhwsihp

3yhwsihp2#

    • 2019年更新:强哥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/

1sbrub3j

1sbrub3j3#

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,请输入一个verified 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'

但以下两项无效:(这些会给你带来错误)

  • 格式必须为**something@sender.com**!!
DEFAULT_FROM_EMAIL = 'sender.com' 
DEFAULT_FROM_EMAIL = '@sender.com'

然后,对于下面验证的**2 email addresses**,

仅使用以下两个选项之一:

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

最后,对于**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'
  • (我已经删除了这些**SMTP Credentials**)
b4qexyjb

b4qexyjb4#

从Django 1.7开始,您可以使用SSL原生发送电子邮件,而无需第三方库。

EMAIL_USE_SSL = True

文件

8mmmxcuj

8mmmxcuj5#

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

s = smtplib.SMTP(host, port)
 s.starttls()
 s.login(user, password)

对于AmazonSES,SMTP必须为:

s = smtplib.SMTP_SSL(host, port)
 s.login(user, password)

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

    • 统一产品描述**:

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

// settings.py
EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend'

(From此处为:Mysterious issue with Django + uWSGI + send email

    • 更新2**:

AmazonSES从现在起支持STARTTLS:)
Amazon SES支持扩展的附件类型、VERP和STARTTLS for SMTP
(from亚马逊通讯)

8oomwypt

8oomwypt7#

我花了大概3个小时来思考这个问题。你的smtplib解决方案是用s.starttls()和s.login()来完成的,这对于python程序来说是很好的,所有的电子邮件凭证都在同一个文件中。但是我不认为这是一个在Django中完成的干净的方法。所以我最终找到了它。不管你的机器是32位还是64位。只要按照下面的步骤做就行了:
1.安装boto
pip安装--升级boto
1.安装django-ses
管道安装django-ses
1.在您的djandosettings.py文件中更新以下信息。
电子邮件后端= 'django_ses. SES后端'
AWS访问密钥ID = '您的用户名'
AWS保密访问密钥= '您的密码'
1.在你的django文件中你想发送邮件的地方
从django.core.mail导入发送邮件
send_mail('测试主题','这是正文','info@abc.com',['hello@abc.com'],静默失败=假)

bvk5enib

bvk5enib8#

我已经尝试了smtp设置,以@Givp(谁回答以上),我想给予完整的AWS的SMTP设置在django。

DEFAULT_FROM_EMAIL = 'admin@domain.com'

ADMINS = [('name', 'name@domain.com')]
MANAGERS = ADMINS

SERVER_EMAIL = 'admin@domain.com' # this is for to send 500 mail to admins

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
MAIL_HOST = 'email-smtp.us-east-1.amazonaws.com' 
EMAIL_PORT = 465
EMAIL_HOST_USER = 'Accesskeyofsmtp'
EMAIL_HOST_PASSWORD = 'secretkeyofsmtp'
EMAIL_USE_TLS = True

在这里,我们必须验证所有的邮件ID发送电子邮件之前。然后一切都会工作,因为我们的期望

相关问题