Google App Engineでメールを受信してみる。その2:Djangoの利用
前回の、Google App Engineでメールを受信してみる。その1:独自ドメインの利用の続きです。
Google App Engineでメールを受信する場合、ドキュメントにあるように、InboundMailHandlerを使うようになっています。
しかし、アプリをDjangoとHelperを使って作成していたので、webappを使ってInboundMailHandlerでメールを受けようとすると、モデルやモジュールをDjangoのアプリと共有するのが難しい状況になってしまっています。
そこでDjangoでメールを受信できないか試してみました。
その経過が以下です。
1. メールのPOSTの送信方法を確認する。
メールは、
/_ah/mail/address
というpathにhttpでPOSTされます。
どのような内容がPOSTされるのかは、http://localhost:8080/_ah/admin/の左のメニューから「Inboud Mail」を選択して表示される、メールテストツールを使いました。
firebugで、このテストツールでのPOSTの内容を確認したところ、パラメータの変数名がつくわけではなく、ただただメールのソースがそのままPOSTされる事がわかりました。
2. POSTされたデータをメールとしてオブジェクト化する。
POSTされるメールは、変数がつかずに渡されるので、request.POST['xxxx']のような形式で取得することはできません。
reuqest.raw_post_data
でメールのデータを取得します。次にこれをメールとして取得します。
import email emailfeed = email.feedparse.FeedParse() emailfeed.feed(request.raw_post_data) emailobj = emailfeed.close()
後は、emailobjからget_payload()などを使ってデータを読み込めばOKです。
最後にいくつかのTIPSを書きます。
a. Subjectのデコード
Subjectのデコードはこのようにやっています。スペースの取り扱いなどで少し問題はあるかもしれませんが、一応、複数行のSubjectもunicode化できます。
subject_list = email.Header.decode_header(emailobj.get('Subject')) subject = "" for i, v in enumerate(subject_list): if v[1] is None: subject += v[0] else: subject += unicode(v[0], v[1])
b. 添付ファイル付きメールのテスト
multipartではないメールであれば、
http://localhost:8080/_ah/admin/inboundmail
を使えばできるのですが、添付ファイルがある場合には、このツールは対応していません。
そこでこのツールを使って、工夫してテストしてみました。
まず添付ファイル付きメールを自分にメールして、そのメールをソースを取得します。
そのソースを、
http://localhost:8080/_ah/admin/inboundmail
の本文に貼り付け、To:等を必要に応じて修正します。
本文に、区切り文字を決めて、ソースの前に追加します。
アプリ側では、request.raw_post_data から区切り文字を使って、本文に貼り付けたメールを取り出し、それをメールのソースとして処理を行います。
テスト後は、この部分をコメントアウトすれば本番環境で利用できます。
と、このような形で添付ファイル付きメール受信を開発しました。
もっといい方法があれば、ぜひ教えてください。