30

我正在尝试将 Amazon 的新 SMTP 服务用于带有 Django 1.3.1 的 SES,但我运气不佳。

我已经创建了我的 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 email-smtp.us-east-1.amazonaws.com 465
4

8 回答 8

30

我找到了一个更简单的解决方案,可以让我使用 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
于 2011-12-22T09:22:40.060 回答
12

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/

于 2019-11-27T18:49:51.583 回答
11

从 Django 1.7 开始,您可以在没有第三方库的情况下本机使用 SSL 发送电子邮件。

EMAIL_USE_SSL = True

文档

于 2015-02-03T03:51:18.983 回答
6

2021 年更新:Django-3.2.4

不需要库,例如django-sesor 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!!

我补充说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


于 2021-06-10T17:55:38.073 回答
5

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

而是使用:

 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'

(来自这里:Django + uWSGI + 发送电子邮件的神秘问题

UPD2

AmazonSES 从现在开始支持 STARTTLS :)

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

(来自亚马逊时事通讯)

于 2011-12-22T00:19:44.920 回答
1

我花了大约 3 小时的时间来解决这个问题。您关于 s.starttls() 然后 s.login() 的 smtplib 的解决方案适用于在同一文件中包含所有电子邮件凭据的 python 程序。但我不认为这在 Django 中是一种干净的方式。所以我终于想通了。无论您的机器是 32 位还是 64 位。只需执行以下步骤:

  1. 安装博托

    pip install --upgrade boto

  2. 安装 django-ses

    点安装 django-ses

  3. 在您的 djando settings.py 文件中更新以下信息。

    EMAIL_BACKEND = 'django_ses.SESBackend'
    AWS_ACCESS_KEY_ID = 'your_username'
    AWS_SECRET_ACCESS_KEY = 'your_password'

  4. 在您要发送电子邮件的 django 文件中

    from django.core.mail import send_mail
    send_mail('测试主题', '这是正文', 'info@abc.com',['hello@abc.com'],fail_silently=False)

于 2013-04-02T22:57:34.163 回答
1

http://aws.amazon.com/articles/2405502737055650

核心python功能示例

于 2011-12-21T15:53:10.510 回答
1

我已经尝试过 smtp 设置以 @Givp(谁在上面回答),我想在 django 中提供完整的 AWS SMTP 设置。

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。然后一切都会按我们的预期工作

于 2018-10-22T13:50:57.907 回答