【问题标题】:Django & Amazon SES SMTP. Cannot send emailDjango 和亚马逊 SES SMTP。无法发送电子邮件
【发布时间】: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


【解决方案1】:

2020 年更新

正如这里的文档所说:Django Email DocumentationEmail_use_ssl

我现在用的是Django 3.0,文档说可以用

EMAIL_USE_SSL = True

...一般用在465端口

我使用 AWS SESport 465 让我的想法发挥作用并发送电子邮件strong> 服务使用该行代替 EMAIL_USE_TLS = True :)

【讨论】:

    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多