Django&亚马逊SES SMTP。无法发送电子邮件

时间:2015-06-09 19:58:14

标签: python django smtp amazon-ses

这是我的settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com'
EMAIL_PORT = '465'
EMAIL_HOST_USER = config_data['EMAIL_HOST_USER']
EMAIL_HOST_PASSWORD = config_data['EMAIL_HOST_PASSWORD']
EMAIL_USE_SSL = True

我已经验证了电子邮件地址,并且还生成了SMTP凭据,我下载了包含IAM用户名,Smtp用户名,Smtp密码的凭据。我使用了EMAIL_HOST_USER的smtp用户名和EMAIL_HOST_PASSWORD的smtp密码。

在django中,我发送了一封包含此行的电子邮件(admin@admin.com已替换为经过验证的电子邮件列表中的Gmail帐户):

send_mail("Subject", "content", "admin@admin.com", [email], fail_silently=False)

那不起作用。从SES控制台发送测试电子邮件(选择已验证电子邮件中的一个电子邮件,然后单击发送测试电子邮件按钮)可以正常工作。

document表示我可以通过命令行使用openssl命令发送电子邮件。所以,我做了ssh到EC2机器,并使用:

openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-east-1.amazonaws.com:25

请注意,我在这里使用25,当我使用端口465时,它输出了:

didn't found starttls in server response, try anyway...
write:errno=32

所以我尝试了端口25,它连接(250 OK)然后输入:

AUTH LOGIN
334 VXNlcm5hbWU6
SMTP_USER
334 UGFzc3dvcmQ6
SMTP_PASSWORD

但输出:535身份验证凭据无效。可能是我使用了错误的凭证?但我直接从smtp用户和密码生成页面复制用户名和密码。

我还尝试将AmazonSESFullAccess策略附加到所有IAM用户,但什么也没发生。

我使用Django 1.8.2。试过Django-ses但它也没有用(运行测试时语法错误,它不支持python 3?)

更新

我将端口更改为587并使用USE_TLS True,现在我可以从django shell发送send_mail。我把这个函数放在我的应用程序views.py:

def test_email(request):
  send_mail("title", "content", "abc@gmail.com", ["def@gmail.com"], fail_silently=False)
  return get_return_object(request, status_code=1)

并在urls.py中我把它放在urlpatterns中:

url(r'^test_email/$', views.test_email, name="test_email"),

当我访问该网址时,没有任何反应。我从shell调用相同的函数test_email,它的工作原理。

更新

事实证明我也可以使用端口465和USE_SSL True并且能够从django shell发送send_mail。但它仍然无法在views.py

中使用

2 个答案:

答案 0 :(得分:2)

如果您使用端口465: 使用pip安装django-smtp-ssl

pip install django-smtp-ssl

然后在settings.py中更改EMAIL_BACKEND,如下所示:

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'

如果使用端口587:

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

答案 1 :(得分:1)

2020年更新

正如文档在此处所述:Django Email DocumentationEmail_use_ssl

此刻我正在使用Django 3.0,文档说明您可以使用

EMAIL_USE_SSL = True

...通常在端口465上使用

我发挥了我的思想,并使用 AWS SES 端口 465 服务使用该行代替EMAIL_USE_TLS = True:)