Django 和 Amazon SES SMTP。无法发送电子邮件

bys*_*reg 5 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
Run Code Online (Sandbox Code Playgroud)

我已经验证了电子邮件地址,还生成了 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)
Run Code Online (Sandbox Code Playgroud)

那没有用。不过,从 SES 控制台发送测试电子邮件(在已验证的电子邮件中选择一封电子邮件并单击发送测试电子邮件按钮)是可行的。

文档说我可以使用 openssl 命令通过命令行发送电子邮件。所以,我通过 ssh 连接到 EC2 机器,并使用:

openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-east-1.amazonaws.com:25
Run Code Online (Sandbox Code Playgroud)

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

didn't found starttls in server response, try anyway...
write:errno=32
Run Code Online (Sandbox Code Playgroud)

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

AUTH LOGIN
334 VXNlcm5hbWU6
SMTP_USER
334 UGFzc3dvcmQ6
SMTP_PASSWORD
Run Code Online (Sandbox Code Playgroud)

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

我还尝试将 AmazonSESFullAccess 策略附加到所有 IAM 用户,但没有任何反应。

我使用的是 Django 1.8.2。尝试了 Django-ses 但它也不起作用(运行测试时出现语法错误,它不支持 python 3?)

更新

我将端口更改为 587 并使用 USE_TLS True,现在我可以从 django shell 发送邮件。我将该函数放在我的应用程序中 view.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)
Run Code Online (Sandbox Code Playgroud)

在 urls.py 中,我将其放入 urlpatterns 中:

url(r'^test_email/$', views.test_email, name="test_email"),
Run Code Online (Sandbox Code Playgroud)

当我访问该 URL 时,没有任何反应。我从 shell 调用相同的函数 test_email 并且它有效。

更新

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

Daw*_*ian 3

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

pip install django-smtp-ssl
Run Code Online (Sandbox Code Playgroud)

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

EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
Run Code Online (Sandbox Code Playgroud)

如果您使用端口 587:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Run Code Online (Sandbox Code Playgroud)