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 から区切り文字を使って、本文に貼り付けたメールを取り出し、それをメールのソースとして処理を行います。

テスト後は、この部分をコメントアウトすれば本番環境で利用できます。


と、このような形で添付ファイル付きメール受信を開発しました。
もっといい方法があれば、ぜひ教えてください。