ブラックホール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と入れてあげると動くようになりました。めでたしめでたし。