とりあえずなダミーメールサーバーを立てる方法とカスタマイズ

 Pythonには組込みでメールサーバー機能が実装(SMTPServer)されており、デバックなどの用途のためにそれを継承したクラスとしてDebuggingServerというクラスが実装されている。当クラスは、ワンライナー呼び出しができ、以下の様な方法で簡単に呼び出す事ができる。
 当サーバーによりメールを全て受付し、標準出力に垂れ流すことができ、他のネットワーク様にご迷惑をおかけしない様に対処することができる。

python -m smtpd -n -c DebuggingServer localhost:1025

(オプション解説)

  • m:$PYTHONPATH からモジュールを検索して実行
  • n:(smtpdオプション)nobodyユーザーで実行
  • c:(smtpdオプション)クラス名を指定して実行

 これを応用すれば、例えば(厳密には異なるかもしれないが)メールサーバーがハングした状態などもエミュレートする事が可能である。
 具体的には、SMTPServerを継承したクラスを作成し、それを実行させれば良い。この場合、ワンライナーで書けなくもないのであろうが私はシェル芸あまり高くないので、以下の様なソースを保存してPythonで実行すれば良い。

[DebuggingServer2.py]

# coding: utf-8

import asyncore
from optparse import OptionParser
from smtpd import SMTPServer

class DebuggingServer2(SMTPServer):
    def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):

        # 以下は一旦DebuggingServer2と同じ処理、好きな事をかけばいい
        inheaders =1
        lines = data.split('\n')
        print('----- DebuggingServer2 START -----')
        for line in lines:
            if inheaders and not line:
                print('X-Peer:', peer[0])
                inheaders = 0
            print(line)
        print('----- DebuggingServer2 END -----')

# メイン処理
DebuggingServer2(('localhost', 8025), None, decode_data=True)
asyncore.loop()

[実行方法]

python c:\temp\DebuggingServer2.py


【参考リンク】
Pythonの公式マニュアル
21.18. smtpd — SMTP サーバー — Python 3.6.5 ドキュメント


smtpdについて丁寧に解説してくれている
エセSMTPサーバー – ビットログ


世の中でDebuggingServerの継承した解説はPython2中心である。私も嵌ってしまったが、当記事で救われた。
github.com


telnetを用いた簡易接続実験方法
ash.jp




Pythonスタートブック [増補改訂版]

Pythonスタートブック [増補改訂版]