tetsunosukeのnotebook

tetsunosukeのメモです

[python] リレーを行うメールサーバを書いた

ローカルで起動しているqmailがあって、そのサーバを使って外にメール送信しようとしているときに、特定の宛先のメールだけはそこへ送信させたくない!という状況が発生(具体的には開発機のデータが存在しないと思っていたのに、間違って実在するユーザに送信されないようにしたかった)したので、これをどうしようか?と考え、リレーサーバ?プロキシサーバを書くようにした。

具体的には、25番でsmtpdを立ち上げ、もとのqmailを別のポートで立ち上げ、

もともとの宛先を条件によって変更し(下記の例ではそもそも決め打ちにして)自サーバのqmailに対して送信するようにした。

こちらを参考にほぼ丸コピ。
http://www.doughellmann.com/PyMOTW/smtpd/

#-*- coding: utf-8 -*-
import sys
import smtpd
import asyncore
import smtplib
import email.Utils
from email.MIMEText import MIMEText

class CustomSMTPServer(smtpd.SMTPServer):
    
    def process_message(self, peer, mailfrom, rcpttos, data):
        qmail_port = 10025
        from_addr = mailfrom
        to_addr = 'xxxxx@example.com'
        msg = MIMEText(data) 
        msg["To"] =  email.Utils.formataddr((to_addr, to_addr))
        msg["From"] = email.Utils.formataddr((from_addr, from_addr))
        msg["Subject"] = 'test' 
        # ローカルのメールサーバに投げる
        s = smtplib.SMTP('localhost', qmail_port)
        s.ehlo()
        s.ehlo()
        s.sendmail(from_addr, [to_addr], msg.as_string())
        s.close()
        return
    
server_port = 25

# 25番ポートで待ち受け
server = CustomSMTPServer(('127.0.0.1', server_port), None)

asyncore.loop()