rs6000のWiki - 適当なMTAサーバー

適当なMTAサーバー

特定のドメインを特定のIPに流し、それ以外のドメインはDNSを引いて転送するMTAサーバーです。
真面目に動作検証していませんので、お遊び程度に使ってください。
特定のドメインな設定はソース嫁(お
MTA.py
# -*- coding: Shift-JIS -*-
import sys,sqlite3,asyncore,smtpd,smtplib,datetime,socket
from email import message_from_string
from email.Header import decode_header,Header
from email.MIMEText import MIMEText
from time import time
from email.Utils import formatdate

sendHost = ['licorice.jp','shuffle.com']

def logWrite(msg):
    fileName = datetime.date.today().isoformat() + '.log'
    d = datetime.datetime.today()
    h = '%s:%s:%s.%sn' % (d.hour, d.minute, d.second, d.microsecond)
    fw = open(fileName, 'a')
    fw.write(h + ': ' + msg + '\n')
    fw.close()

def create_message(from_addr, to_addr, subject, body, encoding):
    # 'text/plain; charset="encoding"'というMIME文書を作ります
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

def send(ipAdr,from_addr, to_addr, msg):
    s = smtplib.SMTP(ipAdr)
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

class MySMTPServer(smtpd.SMTPServer):
    def process_message(self, peer, mailfrom, rcpttos, data):
        msg = message_from_string(data)
        
        # メールを解析
        h = decode_header(msg.get('subject'))
        subject = ''
        for s, c in h:
            subject += s
        cset = msg.get_param('charset')
        b = msg.get_payload(decode=True)
        body = b
        to = decode_header(msg.get('to'))
        mailto = ''
        for t1,t2 in to:
            mailto += t1

        #ファイルに書き出し
        logMsg= 'Receive mail: From=%s,To=%s,Subject=%s,Body=%s,Date=%s' % (mailfrom,mailto,subject,body,msg['Date'])
        print logMsg
        logWrite(logMsg)
        
        #MTA処理
        #Toのメールを分析
        mName,mDomain = mailto.split('@')
        hostIP = ''
        if mDomain in sendHost:
            print '特定のホストへ転送'
            hostIP = '192.168.1.163'     # 特定のホストへ流す
        else :
            print 'DNSを引いて転送'
            hostIP = socket.gethostbyname(mDomain)     # DNSを引く
        msg2 = create_message(mailfrom, mailto, subject, body,'ISO-2022-JP')
        send(hostIP,mailfrom, mailto , msg2)
        logMsg = 'Mail was delivered. IP=[%s],Subject=%s,Body=%s' % (hostIP ,subject,body)
        print logMsg
        logWrite(logMsg)


if __name__ == '__main__':
    MySMTPServer((sys.argv[1], int(sys.argv[2])), None)
    asyncore.loop()