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

5
这是我的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密码的凭据。我将smtp用户名用于EMAIL_HOST_USER,将smtp密码用于EMAIL_HOST_PASSWORD。

在Django中,我使用以下代码行发送了一封电子邮件(admin@admin.com被替换为已验证电子邮件列表中的Gmail帐户):

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

那样做没有用。但是在SES控制台中发送测试电子邮件(选择已验证的电子邮件之一并单击“发送测试电子邮件”按钮)是有效的。

这份文档说我可以使用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发送邮件。我将该函数放在我的应用程序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中仍然无法工作。

请提供错误信息。尝试生成新的凭据。 - Edwin Lunando
请看更新的部分。我更改了端口,现在可以通过shell发送邮件,但出于某种原因,我无法通过URL发送邮件。 - bysreg
2个回答

3
如果您使用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'

3

2020年更新

如文档所示:Django电子邮件文档Email_use_ssl

我目前正在使用Django 3.0, 文档中提到,您可以使用

EMAIL_USE_SSL = True

......通常用于端口465

我使用AWS SES发送邮件并使用该行代码中的端口465服务,而不是使用EMAIL_USE_TLS = True :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接