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

asyncoreできみにも書けるSMTPサーバ

Python

携帯Webでよくある、「空メールを送信してください」というのを実装するには、ぱっと思いつく限り、

  • コマンドへのメッセージ配信
  • 別のSMTPサーバへトランスポート

という方法があって、トランスポートを使った方法を試してみたくて、次のようなコードを書いてみた。

import asyncore
import smtpd
from email import message_from_string

class MySMTPServer(smtpd.SMTPServer):
    def process_message(self, peer, mailfrom, rcpttos, data):
        print '---------- MESSAGE FOLLOWS ----------'
        msg = message_from_string(data)
        print 'From:', mailfrom
        print msg.as_string()
        print '------------ END MESSAGE ------------'

if __name__ == '__main__':
    MySMTPServer(('mydomain', 20025), ('mydomain', 25))
    asyncore.loop()


実際には、 process_message のところで、「空メールを受信してホゲホゲ」という処理を書く。でも、いろいろ考えたあげく、コマンドへの配送を使った方が開発が楽、という結論に落ち着いた。うーん、皆どうしているんだろう?


それはともかく、初めてasyncore関連のモジュールに触ってみて、便利だと思った。開発環境にダミーのSMTPサーバを立てるとすると、うくくの人が書いているようなTwistedを使った方法もよいが、標準ライブラリのsmtpdを使うと三行で書ける。

import asyncore,  smtpd
smtpd.DebuggingServer((('localhost', 20025), ('localhost', 25))
asyncore.loop()