我們公司買了一個短信平臺,用來給各個信息系統發短信。用法是把短信內容和號碼寫到一個數據庫裏面。
因爲我們這邊不少系統只支持郵件報警。今天閒着沒事,就順手寫了一個轉換器。
python 下面有現成的smtpd框架,網上還能找到示例說明,實現一個smtp服務器非常容易。
#!/usr/bin/env python import smtpd,asyncore,csv,datetime import pyodbc,MySQLdb class Method(object): def sendmessage(self,target,message): pass class ToCSV(Method): def __init__(self): self._f=open('data.csv','wb') self.sender=csv.writer(self._f) def __del__(self): self._f.close() def sendmessage(self,target,message): self.sender.writerow((target,message)) class ToConsole(Method): def sendmessage(self,target,message): print('sending to %s\n'%target) print('the message is %s\n'%message) class ToDB(Method): def sendmessage(self,target,message): with pyodbc.connect('DRIVER={SQL Server};SERVER=xxx.xxx.xxx.xxx;DATABASE=db;UID=usr;PWD=psw') as db: cu=db.cursor() cu.execute("INSERT INTO table (sendto,content) VALUES ('%s','%s')"%(target,message)) #------------------------------------------------------- class MailServer(smtpd.SMTPServer): def __init__(self,sendmethod=ToDB,host='',port=25): self.sender=sendmethod() self.usr_dict=self._loaddata() smtpd.SMTPServer.__init__(self,(host,port),None) print ('----------------server has been started---------------') def process_message(self,peer,mailfrom,rcttos,data): for rcpt in rcttos: phone=self._getphone(rcpt.split('@')[0]) if phone is None: continue try: self.sender.sendmessage(phone,data) except: print('%s: %s sending message failed'%(str(datetime.datetime.now()),mailfrom.split('@')[0])) def _loaddata(self): db=MySQLdb.connect('xxx.xxx.xxx.xxx','usr','psw','db') cu=db.cursor() cu.execute("SELECT USER_ID, PHONE FROM table") result=cu.fetchall() db.close() return dict(result) def _getphone(self,usr): if self.usr_dict.has_key(usr): return self.usr_dict[usr] else: return None #--------------------------------------------------------- def loop(): server=MailServer() try: asyncore.loop(timeout=2) except KeyboardInterrupt: print('-------------server stop------------------') server.close() if __name__=='__main__': loop()