2

受信メールを解析して保存できるアプリケーションを 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)

私が間違っていることは何ですか?

4

2 に答える 2

7

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/recomingmail

于 2012-05-10T16:11:24.583 に答える
3

問題は、 handler の WSGIApplication を宣言していないことですLogSenderHandler

それについては、 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)

その後、WSGI アプリケーションを指定する必要があります。your app.yaml

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

注:ドキュメントに書かれているように、クラスに は URL のマップを宣言するのに役立つInboundMailHandler特別なメソッドがあります。mapping

于 2012-05-10T16:31:46.197 に答える