【问题标题】:Python GAE: incoming mail handler errorPython GAE:传入邮件处理程序错误
【发布时间】:2012-05-19 05:47:49
【问题描述】:

我正在 GAE 上编写可以解析和存储传入邮件的应用程序。我已经为电子邮件解析准备了一些简单的代码,但是当我尝试在本地开发服务器上模拟从管理开发控制台接收电子邮件时出现问题:

/develop/google_appengine/google/appengine/runtime/wsgi.py", line 193, in Handle
    result = handler(self._environ, self._StartResponse)
TypeError: 'module' object is not callable
INFO     2012-05-08 16:14:43,516 dev_appserver.py:2891] "POST /_ah/mail/test@example.com HTTP/1.1" 500 -

app.yaml:

application: mailhandler
version: 1
runtime: python27
api_version: 1
threadsafe: true

inbound_services:
- mail

handlers:
- url: /_ah/mail/.+ 
  script: email_handler
  login: admin

email_handler.py:

from google.appengine.ext import webapp 
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import mail

from models import DataStoreManager

class LogSenderHandler(InboundMailHandler):
    # Receiving new mail message and parsing it
    def receive(self, mail_message):                                                                                                                      
        manager = DataStoreManager()
        instance = manager.get_instance_by_email(mail_message.sender.lowercase())

        email_key = manager.store_email(instance, instance.user, mail_message, mail_message.attachments)

我做错了什么?

【问题讨论】:

  • 能否请您发布整个回溯?

标签: python google-app-engine email handler


【解决方案1】:

我认为发生的情况是,在您的 app.yaml 中,您将模块/文件定义为脚本而不是应用程序,该模块当然是不可调用的。

app.yaml 定义更改为:

handlers:
- url: /_ah/mail/.+ 
  script: email_handler.application
  login: admin

并在email_handler.py末尾添加这一行

application = webapp2.WSGIApplication([LogSenderHandler.mapping()], debug=True)

这里的文档: https://developers.google.com/appengine/docs/python/mail/receivingmail

【讨论】:

    【解决方案2】:

    问题是你没有为你的处理程序LogSenderHandler声明一个WSGIApplication。

    您必须阅读以下内容: https://developers.google.com/appengine/docs/python/python27/using27

    from google.appengine.ext import webapp 
    from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 
    from google.appengine.ext.webapp.util import run_wsgi_app
    from google.appengine.api import mail
    
    from models import DataStoreManager
    
    class LogSenderHandler(InboundMailHandler):
        # Receiving new mail message and parsing it
        def receive(self, mail_message):                                                                                                                      
            manager = DataStoreManager()
            instance = manager.get_instance_by_email(mail_message.sender.lowercase())
    
            email_key = manager.store_email(instance, instance.user, mail_message, mail_message.attachments)
    
    application = webapp.WSGIApplication([LogSenderHandler.mapping()], debug=True)
    

    之后你必须在your app.yaml中指定WSGI应用程序

    handlers:
    - url: /_ah/mail/.+ 
      script: email_handler.application
      login: admin
    

    注意: 正如文档中所写,InboundMailHandler 类有一个特殊的方法mapping 可以帮助您声明 URL 的映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2012-04-12
      • 2014-06-17
      • 2013-11-03
      相关资源
      最近更新 更多