这是我的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
中使用答案 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 Documentation和Email_use_ssl
此刻我正在使用Django 3.0,文档说明您可以使用
EMAIL_USE_SSL = True
...通常在端口465上使用
我发挥了我的思想,并使用 AWS SES 和 端口 465 服务使用该行代替EMAIL_USE_TLS = True:)