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 みたいに書かないといけません。


※とりあえず、汚く動くように書きました。
近日修正予定
多重継承とか、思ったとおりの動きではありませんでした。