从gE上的GAE dev_appserver发送邮件时SMTPSender拒绝

时间:2013-10-30 11:25:30

标签: google-app-engine

以下是我的电子邮件相关dev_appserver选项:

--smtp_host=smtp.gmail.com --smtp_port=25 --smtp_user=me@mydomain.com --smtp_password="password"

现在,这仍然不起作用,每次Google发布新的dev_appserver时,我都必须编辑api / mail_stub.py,以便按照S/O answer在本地工作。

但是,即使这种解决方法现在也停止了工作。我得到以下异常:

SMTPSenderRefused: (555, '5.5.2 Syntax error. mw9sm14633203wib.0 - gsmtp', <email.header.Header instance at 0x10c9c9248>)

有谁比我聪明,知道如何解决它吗?

更新 我能够通过使用电子邮件地址(例如发件人和收件人)以简单字符串(name@domain.com)的“普通”格式发送电子邮件以发送dev_appserver,而不是使用尖括号样式({{1 }})。这在生产中不是问题:收件人和发件人电子邮件地址可以在Name <name@domain.com>调用中使用尖括号。我为dev_appserver和production之间的这种不同行为提出了一张票:https://code.google.com/p/googleappengine/issues/detail?id=10211&thanks=10211&ts=1383140754

2 个答案:

答案 0 :(得分:1)

看起来是因为'sender'现在存储为dev服务器中的“email.header.Header”实例而不是字符串(因为我认为是SDK 1.8.3)。

从我的测试中,当一个'From'字符串如“Name”被传递到smtplib.SMTP.sendmail时,它解析字符串以找到尖括号内的部分(如果有的话),用作SMTP发送者,给出“ ”。但是,如果此参数是“email.header.Header”,则只是转换为字符串并使用它而不进一步解析,给出“&gt;”,从而导致我们看到的问题。

以下是我刚刚在issue tracker发布的针对google / appengine / api / mail_stub.py的补丁,将此参数转换回字符串(适用于我):

--- google/appengine/api/mail_stub-orig.py      2014-12-12 20:04:53.612070031 +0000
+++ google/appengine/api/mail_stub.py   2014-12-12 20:05:07.532294605 +0000
@@ -215,7 +215,7 @@


       tos = [mime_message[to] for to in ['To', 'Cc', 'Bcc'] if mime_message[to]]
-      smtp.sendmail(mime_message['From'], tos, mime_message.as_string())
+      smtp.sendmail(str(mime_message['From']), tos, mime_message.as_string())
     finally:
       smtp.quit()

答案 1 :(得分:0)

另一种替代方法是修补用于在开发环境中测试App Engine邮件功能的SMTP服务器(而不是修补mail_stub.py)。

例如,我正在使用subethasmtp Wiser,并且可以通过修补org.subethamail.smtp.util.EmailUtils.extractEmailAddress来接受嵌套的尖括号(详情张贴在here上)来解决此问题。