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 ------------