我们公司买了一个短信平台,用来给各个信息系统发短信。用法是把短信内容和号码写到一个数据库里面。因为我们这边不少系统只支持邮件报警。今天闲着没事,就顺手写了一个转换器。python 下面有现成的smtp
.
我们公司买了一个短信平台,用来给各个信息系统发短信。用法是把短信内容和号码写到一个数据库里面。
因为我们这边不少系统只支持邮件报警。今天闲着没事,就顺手写了一个转换器。
python 下面有现成的smtpd框架,网上还能找到示例说明,实现一个smtp服务器非常容易。
#!/usr/bin/env pythonimport smtpd,asyncore,csv,datetimeimport pyodbc,MySQLdbclass Method(object): def sendmessage(self,target,message): passclass 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()