来自 EC2 通过 Gmail 的 Django send_mail() 给出 SMTPAuthenticationError - 但在本地主机中工作正常

Django send_mail() from EC2 via Gmail gives SMTPAuthenticationError - but works fine in localhost

Django 项目 settings.py 包括以下内容:

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = "you.cant.see.me@gmail.com"
EMAIL_HOST_PASSWORD = "thug_life"
EMAIL_PORT = 587
EMAIL_USE_TLS = True

我的应用程序 views.py 包含以下内容

def send_classic_email(request):
    from django.core.mail import send_mail
    send_mail(
        subject = "Tale of two cities",
        from_email = "Charles Dickens <you.cant.see.me@gmail.com>",
        recipient_list = ["someone@example.com"],
        message = "There were 2 cities",
        html_message = "<p>There were 2 cities</p>",
        fail_silently = False,
    )
    print "Absolutely Perfectly Done"

从本地主机试过。在 return 中获得 SMTPAuthenticationError

SMTPAuthenticationError at /send_classic_email/
(534, '1.3.95 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=fsadjSADJH\n1.3.95 
fjkshFHAKSHkdfshkfkhj-sfjdhFsadASDA_\n1.3.95 
dasdASDADas-aDas-hfhjsadASDSAhjjhd\n1.3.95 
ADSaSADkja_adhjkADKjhads-ASADS_SDAKjadAKJhsADS-k\n1.3.95 
sadhkjADSAKJSDJAlkjdaA> Please log in via your web browser and\n1.3.95 
then try again.\n1.3.95  
Learn more at\n1.3.95  
https://support.google.com/mail/answer/78754 dkahASDASlkjdas.25 - gsmtp')

然后访问 https://www.google.com/settings/security/lesssecureapps 并启用 less secure app 设置。

之后,从本地主机再次尝试。明白了:

Absolutely Perfectly Done

在 AWS EC2 上部署了这段代码。从 EC2 试过。再次获得相同的 SMTPAuthenticationError

SMTPAuthenticationError at /send_classic_email/
(534, '1.3.95 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=fsadjSADJH\n1.3.95 
fjkshFHAKSHkdfshkfkhj-sfjdhFsadASDA_\n1.3.95 
dasdASDADas-aDas-hfhjsadASDSAhjjhd\n1.3.95 
ADSaSADkja_adhjkADKjhads-ASADS_SDAKjadAKJhsADS-k\n1.3.95 
sadhkjADSAKJSDJAlkjdaA> Please log in via your web browser and\n1.3.95 
then try again.\n1.3.95  
Learn more at\n1.3.95  
https://support.google.com/mail/answer/78754 dkahASDASlkjdas.25 - gsmtp')

前往 EC2 安全组:

还是一样 SMTPAuthenticationError

为什么它在 localhost 而不是 EC2 实例中运行良好?

运行 Django 1.8.0Python 2.7.6Ubuntu 14.04.3 LTS

我觉得亚马逊不允许这样做。他们真的不希望您从他们的服务器发送邮件,所以他们阻止了它。基本上,这是为了避免垃圾邮件发送者过去常常通过虚拟卡车从 EC2 发送电子邮件。我建议您改用 mailgun(或者 SES,如果您真的喜欢 AWS,但我可能不会)之类的东西来处理发送电子邮件。有一个很好的django email backend for mailgun,所以你根本不需要改变你的代码。

您可能需要解锁验证码才能让 Django 为您发送:accounts.google.com/displayunlockcaptcha

验证码是您需要在表单中输入才能转到下一页的小字符。这是大多数公司都依赖的安全预防措施。

您能够在本地主机上摆脱它的原因是因为您本质上是控制验证码的公司。您告诉您的服务器,"send no matter what; it's safe." 但是,在这种情况下,Google 控制着验证码。由于您使用的是亚马逊,因此阻止电子邮件是 Google 保护其服务器并确保亚马逊不是垃圾邮件的一种方式。通过单击 link,您告诉 Google 允许所有来自您的电子邮件的传出连接。

这有意义吗?