【发布时间】:2015-08-24 20:09:21
【问题描述】:
这是我的 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 命令通过命令行发送电子邮件。所以,我对 EC2 机器做了 ssh,然后使用:
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 Authentication Credentials Invalid。会不会是我使用了错误的凭据?但我直接从 smtp 用户和密码生成页面复制用户名和密码。
我还尝试将 AmazonSESFullAccess 策略附加到所有 IAM 用户,但没有任何反应。
我使用 Django 1.8.2。尝试过 Django-ses 但它也不起作用(运行测试时出现语法错误,它不支持 python 3?)
更新
我将端口更改为 587 并使用 USE_TLS True,现在我可以从 django shell 发送邮件。我把函数放在我的应用程序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"),
当我访问 URL 时,什么也没有发生。我从 shell 调用相同的函数 test_email 并且它可以工作。
更新
事实证明,我也可以使用端口 465 和 USE_SSL True 并能够从 django shell 发送邮件。但它仍然不能在views.py中工作
【问题讨论】:
-
请把错误信息放上去好吗?尝试生成新凭据。
-
请参阅更新部分。我更改了端口,现在我可以从 shell 发送邮件,但由于某种原因,我无法通过 url 发送邮件
标签: python django smtp amazon-ses