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にやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
- 作者: 辻真吾
- 出版社/メーカー: 技術評論社
- 発売日: 2018/04/12
- メディア: 大型本
- この商品を含むブログ (1件) を見る