pythonでメールサーバ
ちょっといろいろ事情があって
python のメールサーバを使っていたんですが
ものすごく、ハマりました。
python の smtpd の DebuggingServer ですが、
EHLO に対応していません。
それがわからずに、メールが受信できるときとできないときがあって、ずっぽりハマってました。
というわけで、EHLOに対応したpythonのメールサーバです。
#!/usr/bin/env python import smtpd import asyncore class ESMTPChannel(smtpd.SMTPChannel): def smtp_EHLO(self, arg): if not arg: self.push('501 Syntax: EHLO hostname') return if self._SMTPChannel__greeting: self.push('503 Duplicate HELO/EHLO') else: self._SMTPChannel__greeting = arg self.push('250 %s' % self._SMTPChannel__fqdn) class ESMTPServer(smtpd.SMTPServer): def handle_accept(self): conn, addr = self.accept() print >> smtpd.DEBUGSTREAM, 'Incoming connection from %s' % repr(addr) channel = ESMTPChannel(self, conn, addr) class EDebuggingServer(ESMTPServer): def process_message(self, peer, mailfrom, rcpttos, data): inheaders = 1 lines = data.split('\n') print '---------- MESSAGE FOLLOWS ----------' for line in lines: # headers first if inheaders and not line: print 'X-Peer:', peer[0] inheaders = 0 print line print '--------- END MESSAGE -------------' if __name__ == '__main__': EDebuggingServer(('localhost', 25), None) asyncore.loop()
pythonのオブジェクト指向について勉強中なので
もっと他にキレイなやり方があるかもしれません。(だれかー教えてー)
親クラスのプライベート風変数の呼び方がわからなくて、すごくハマりましたが
「_親クラスの名前」をアタマに付けるだけでいいみたいです。
ただし、_smtpd.SMTPChannel__greeting はダメで
_SMTPChannel__greeting みたいに書かないといけません。
※とりあえず、汚く動くように書きました。
近日修正予定
多重継承とか、思ったとおりの動きではありませんでした。