読者です 読者をやめる 読者になる 読者になる

Pythonのsmtpdモジュールで開発用のメールサーバーを用意してUpstartで動かす

Python Upstart

PythonのsmtpdモジュールはSMTPサーバーを実装するためのクラスを提供するが、コードを書かなくても利用できる。
開発用のメールサーバー(実際にメールを配送せず、内容をファイルに出力)として使うにはDebuggingServerクラスを使う。
20.13. smtpd — SMTP サーバー — Python 2.7.x ドキュメント

$ sudo python -m smtpd -c DebuggingServer localhost:25

毎回コマンドで起動してもいいが、Upstartの設定ファイルを用意してサービスとして動かしてみる。
試したのは、Ubuntu12.04。

Upstartの設定

/etc/init/smtpd.conf
description     "SMTP Server"

#start on runlevel [2345]
#stop on runlevel [!2345]

respawn
respawn limit 3 5

exec python -m smtpd -c DebuggingServer localhost:25

respawn limitの設定により、プロセスが落ちた場合は5秒ごとに3回まで再起動。
OS起動時に実行するなら、start〜, stop〜のコメントを外す。

サービスの起動

startコマンドで起動、stopコマンドで停止、restartコマンドで再起動

$ sudo start smtpd

メール送信のテスト

Pythonのsmtplibとemailでメール送信をテストする。

test.py
import smtplib
from email.mime.text import MIMEText
me = 'spam@example.org'
you = 'egg@example.org'
msg = MIMEText('Hello, World!\nSpam Egg Ham\n')
msg['Subject'] = 'Test'
msg['From'] = me
msg['To'] = you
server = smtplib.SMTP('localhost')
server.sendmail(me, [you], msg.as_string())
server.quit()

作成したスクリプトを実行する。

$ python test.py

送信したメールの内容

送信したメールの内容は標準出力に出力される。
Upstartで実行したサービスの標準出力は、 /var/log/upstart/<サービス名>.log に出力される。

tokibito@ubuntu:~$ sudo cat /var/log/upstart/smtpd.log
---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: Test
From: spam@example.org
To: egg@example.org
X-Peer: 127.0.0.1

Hello, World!
Spam Egg Ham
------------ END MESSAGE ------------

以上。
UbuntuだとPythonは入ってるし、軽いしなかなか良い。