郵件報警轉換器

我們公司買了一個短信平臺,用來給各個信息系統發短信。用法是把短信內容和號碼寫到一個數據庫裏面。

因爲我們這邊不少系統只支持郵件報警。今天閒着沒事,就順手寫了一個轉換器。

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章