ブラックホールSMTPDをハック(デバッグ?)してみる
開発用にすべてを吸収して、記録する(実際に配信はしたくない)SMTPサーバーが必要になったのでいろいろ探してみたらPythonで実装しているものがあったので使ってみた。
http://www.everes.net/2007/jul/06/djblackhole/
うぉぉぉこれちょー便利!!!
とおもってtelnet localhost 587(587でListenするようにしたので)
HELO foobar.hogehoge MAIL FROM: cloneko@example.com RCPT TO: bar@example.com DATA Subject: foobar hogehoge .
Connection Reset by peer
!!!!!
ほんでもって綺麗に保存されてないオチ。
でも上司からはよ使えるようにせーという無言の圧力があり、ハック大会。。。
(ちなみに当日ではどうしようもなく、休日に電話でどうにかしろと言われたので家でハック大会)
結論だけ言えば悪いのはSQLiteかよ!!!
#SQLiteが悪いとは思ってませんけどね。
わかったこと
- SMTPをパースしてdjangoで表示できるようにSQLiteにいろんなデータを格納しているみたい
- DBに格納する時点でコケてるぽい
- 普通にOutlook Expressから送ると登録される
- Outlook Expressの内容をTELNETで送ると登録される
- どうやら登録する項目に「charset」ってのがあるらしい
- ソース(server.py)を追っ掛けてみたらデフォルト値は''(空文字)
- どうやら「charset」はNOT NULLのようだ
- メールの中から文字コードが判断できない時にはcharsetの値は空文字になるらしい。
- っていうかSQLiteってそういえば空文字はNULL扱いなんだよね
というわけでserver.pyの30行目を
charset = 'latin1'
とlatin1と入れてあげると動くようになりました。めでたしめでたし。