風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

Google App Engine/Python等で日本語のメールを扱いやすくするモジュール

GAE/Pythonで、素直にこのドキュメントの記述に従ってメール受信処理を書こうとすると、特に日本語等の取り扱いで文字化けに悩まされてしまうようです。

そこで、もうちょっとだけましに取り扱えるようなモジュールを書いてみました。
すっかり忘れていたGoogle App Engineのメールの扱いづらさに辟易中 - 風柳メモの続きだったり。
モジュール自体はMailHookを作った当時に書いたソースほぼそのまま。2009年11月だから、あの後GAEの方も改善されてたりするのかな〜。

そういやhookhubも無くなってMailHookもほとんど使えないんだよな〜

ダウンロード

新版(GitHub管理・Python 2.7 で動作確認)

github.com

旧版

email_decoderモジュール

ZIPファイルを解凍すると出てくるemail_decoder.pyを用います。Python 2.5、2.6で動作確認。

使い方の例

新版の使い方はこちらのサンプルを参照のこと。



こちら(↓)は旧版の使い方

# 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 dayPrice
Email API100 recipients$0.01 / 100 recipients

http://www.google.com/enterprise/appengine/appengine_pricing.html

Freeだと今まで2000通/日受信出来たのが、100通/日に減らされるのか……。