在App Engine开发服务器上通过SMTP服务器发送电子邮件时出现错误

13

我正在尝试使用这个示例代码和这些命令行选项发送电子邮件:

dev_appserver.py --smtp_host=smtp.gmail.com --smtp_port=25 --smtp_user=xxx@gmail.com--smtp_password=k1tt3ns myapp

然而,当我的应用程序尝试发送电子邮件(在开发服务器上)时,我收到以下错误:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 500, in __call__
    handler.post(*groups)
  File "C:\Documents and Settings\desk\Desktop\apps\temp\main.py", line 139, in post
    """)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\mail.py", line 205, in send_mail
    message.send(make_sync_call)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\mail.py", line 474, in send
    make_sync_call('mail', self._API_CALL, message, response)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 68, in MakeSyncCall
    apiproxy.MakeSyncCall(service, call, request, response)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py", line 240, in MakeSyncCall
    stub.MakeSyncCall(service, call, request, response)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\apiproxy_stub.py", line 80, in MakeSyncCall
    method(request, response)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\mail_stub.py", line 203, in _Send
    self._SendSMTP(mime_message, smtp_lib)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\mail_stub.py", line 133, in _SendSMTP
    smtp.login(self._smtp_user, self._smtp_password)
  File "C:\Python26\lib\smtplib.py", line 552, in login
    raise SMTPException("SMTP AUTH extension not supported by server.")
SMTPException: SMTP AUTH extension not supported by server.

首先确保您的ISP允许您使用第三方SMTP服务器发送电子邮件。大多数都可以,但有些提供商会阻止访问SMTP服务器,以确保他们的客户不会开始向全世界发送垃圾邮件。 - Wim ten Brink
5个回答

18

dev_appserver.py不支持Gmail所需的TLS。你可以通过在api/mail_stub.py中添加几行代码来启用它:

# After smtp.connect(self._smtp_host, self._smtp_port)
smtp.ehlo()
smtp.starttls()
smtp.ehlo()

注意! 这是一个快速而简单的解决方案。你应该添加某种标志来告诉它是否要使用TLS,因为这并不总是需要的。


嗨Blixt,感谢您给出了我的请求的解决方案,根据上述更改它已经可以正常工作了...就像Gmail一样,我的公司是Google中的一个域,在更改了我的公司详细信息后,它就不能工作了...也就是说,我用我的公司名称替换了Gmail...这样正确吗? 正如您上面所说,该解决方案不是首选,那么正确的解决方案应该是什么呢? - SKSK
然后在部署时,它仍然可以工作吗?我不认为我能够从Google应用引擎API SDK编辑文件。 - Totty.js
是的。邮件API的配置是由Google自己完成的,所以您不需要担心与邮件服务器的连接方式。 - Blixt
@Blixt。我认为这个解决方法可能已经失效了。至少,在最新的dev_appserver 1.8.6中对我来说是这样的。如果你愿意查看一下我的另一个问题,我将欠你100万个赞。 - HorseloverFat

4

@Raymond

在终端中执行以下命令:

find / -name "mail_stub.py" -type f 2>/dev/null

在我的情况下,它返回:
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/mail_stub.py

0

0
其他方法已不再必要:
/appengine/api/mail_stub.py 中设置以下内容。
if self._allow_tls and smtp.has_extn ('STARTTLS'):
  smtp.starttls ()

在我的应用引擎SDK版本1.9.15上运行良好。


0
对于在2018年或之后查看此答案的任何人:这个解决方法不再需要了。现在您可以像原帖作者编写的那样使用该命令:
dev_appserver.py --smtp_host=smtp.gmail.com --smtp_port=25 --smtp_user=xxx@gmail.com --smtp_password=yyy myapp

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