読者です 読者をやめる 読者になる 読者になる

構想メモ

Django Mobile

書きかけのメモです。

mobilejp.management.commands.mobilejpmailのようなモジュール名でPostfixのコマンド処理用のクラスを作る。すると、INSTALLED_APPSにmobilejpを入れておけば、

$ python manage.py help mogilejpmail
Usage: manage.py mobilejpmail [options]

Options:
  --settings=SETTINGS ...()

manage.pyを通してコマンドを実行できるので、aliasesに、

aliaes_name: "|/usr/local/bin/django-admin.py mobilejpemail --settings=your.settings --pythonpath=/path/to/yourapp > /dev/null 2>&1"

に書いておけば、aliasesをいちいち変更しなくても、Python側の設定だけでメールの受信処理を制御できるのでよさそうだ。

設定

settings.pyに、送信先と実行処理の対応付けを行うモジュール名を指定する。

MOBILEJP_MAIL_COMMAND_CONF='yourapp.mail.receivers'

yourapp/mail/receivers.pyに次のような感じで対応をかく。Djangoのurls.pyと同じ流儀にしたい。

patterns = (
  '',
  ('^reg-(?P(uniq_id)\w{16})@', 'yourapp.mail.handlers.user_registration'),
)

reg-(unique_id)@example.com宛てのメールに対して、yourapp.mail.handlers.user_registrationという関数を呼ぶ。

yourapp.mail.handlers.user_registrationは、

def user_registration(msg, uniq_id):
    # write your application code here
    pass    

第一引数のmsgはemail.mime.Messageのサブクラスのインスタンスか、それと同等のインターフェースを持つオブジェクト。

実装上の懸案点

戻り値

処理の戻り値としてMessageオブジェクトを返した場合、送信元ユーザにメールを送り返すようにすると便利そうだ。

def email_confirmation(msg, uniq_id):
   # 空メールを処理する何らかの処理
   pass

   #「メールのアドレスの確認がとれました。
   # こちらのURLにアクセスして登録を完了してください」
   # 的なメールを返す
   return Message()

テンプレートを読んで、メールを返すショートカット関数があるとさらに便利かも。

def email_confirmation(msg, uniq_id):
   # 何らかの処理
   return render_to_message('path/to/mail/template.txt',
                            Context({ 'spam': 'SPAM',
                                      'egg': 'EGG',
                                    }))
MIME文書のデコード

アプリケーションの中で関心があるのは、デコード済みのデータであるのに、emailモジュールの流儀に従って、

payload = msg.get_payload(decode=True)

のように毎度毎度デコードを行うのはナンセンスだと思う。さらに言うならば、デコード済みのデータは、MimeTypeがtext/*やhtml/*ならばユニコード文字列であるべきだし、image/*やvideo/*ならばバイナリデータであるべきである。

どういう実装になるか分からないけど、僕が期待するインターフェースは次のとおり。(msgはtext/plainなMIME文書とする。)

payload = msg.get_palyload()
assert isinstance(payload, unicode) is True
例外処理

later

twistedを使う場合

Postfixのコマンド配信ではなく、twistedで独自のSMTPサーバを書く場合・・・

later