GAE/Pythonで、素直にこのドキュメントの記述に従ってメール受信処理を書こうとすると、特に日本語等の取り扱いで文字化けに悩まされてしまうようです。
そこで、もうちょっとだけましに取り扱えるようなモジュールを書いてみました。
すっかり忘れていたGoogle App Engineのメールの扱いづらさに辟易中 - 風柳メモの続きだったり。
モジュール自体はMailHookを作った当時に書いたソースほぼそのまま。2009年11月だから、あの後GAEの方も改善されてたりするのかな〜。
そういやhookhubも無くなってMailHookもほとんど使えないんだよな〜
ダウンロード
新版(GitHub管理・Python 2.7 で動作確認)
使い方の例
新版の使い方はこちらのサンプルを参照のこと。
こちら(↓)は旧版の使い方
# email_decoderクラスのインポート from email_decoder import email_decoder # MIMEエンコードされたメールを読み込んでデコード処理を行い、mailオブジェクトを作成 mail = email_decoder(mime_encoded_mail_text) # タイトル(Subject)表示 print mail.subject # 本文(text/plain)表示 print mail.get_body_plain() # 本文(text/html)表示 print mail.get_body_html() # To 表示(1) print u'To: %s' % (mail.to) # To 表示(2) to_list = mail.listaddr('to',address_only=False) print u'To: %s' % (u', '.join([u'%s <%s>' % (_n if _n else _a,_a) for (_n, _a) in to_list]))
その他の使い方はソースのif __name__ == '__main__':以降にもいくつか例があるので参照して下さい(手抜き)
Google App Engine/Pythonで使用する場合
GAE/Pythonでメールを受信する場合、ドキュメントに従って、InboundMailHandlerを継承したclassに
import logging from google.appengine.ext.webapp.mail_handlers import InboundMailHandler class MyMailHandler(InboundMailHandler): def receive(self, mail): logging.info(u'Subject: ' + mail.subject)
のように、receive()を定義しますが、この代わりに、
import logging from google.appengine.ext.webapp.mail_handlers import InboundMailHandler from email_decoder import email_decoder class MyMailHandler(InboundMailHandler): def post(self): mail = email_decoder(self.request.body) logging.info(u'Subject: ' + mail.subject)
のようにして、post()を定義し、MIMEエンコードされたメールの本体が含まれるself.request.bodyをemail_decoder()の引数に指定して使用します。
それにしても…
Free quota per app per day Price Email API 100 recipients $0.01 / 100 recipients
http://www.google.com/enterprise/appengine/appengine_pricing.html
Freeだと今まで2000通/日受信出来たのが、100通/日に減らされるのか……。