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"
从localhost尝试。得到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
设置。
之后,再次尝试从localhost。得到了这个:
绝对完美地完成
在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.0
Python 2.7.6
上运行Ubuntu 14.04.3 LTS
答案 0 :(得分:9)
您可能需要解锁验证码才能让Django为您发送:accounts.google.com/displayunlockcaptcha
验证码是您需要输入表单才能转到下一页的小字符。这是大多数公司所依赖的安全预防措施。
您能够在本地主机上使用它的原因是因为您基本上是控制验证码的公司。你告诉你的服务器,“无论发送什么,它都是安全的。”但是,在这种情况下,Google可以控制验证码。由于您使用的是亚马逊,因此阻止电子邮件是Google保护其服务器并确保亚马逊不是垃圾邮件的一种方式。通过点击该链接,您告诉Google允许通过您的电子邮件发送所有传出连接。
这有意义吗?
答案 1 :(得分:0)
我有一种感觉亚马逊不允许这样做。他们真的不希望你从他们的服务器发送邮件,所以他们阻止它。它基本上是为了避免垃圾邮件发送者,他曾经通过虚拟卡车来自EC2发送电子邮件。我建议你使用像mailgun(或SES,如果你真的喜欢AWS,但我可能不会)处理发送电子邮件。有一个很好的django email backend for mailgun,所以您根本不需要更改代码。