# -*- 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()