本次实现的是一个通过邮件来远程控制电脑,以达到某些远程操作,例如让电脑执行CMD命令,播放音乐,打开指定文件等操作的项目。代码参考了网上的部分教程。
具体流程:
在python代码中,通过一个循环来接受指定邮箱中的邮件,此次采用的是通过邮件的title也就是标题来传输命令,程序接受到指定邮件后,根据title执行相应操作。操作成功后,再发送邮件给指定邮箱,表示操作执行成功。
(如若实际使用,该程序可能存在若干‘bug‘,部分为程序本身问题,部分由于邮件传输的延迟导致,部分由于邮件本身格式导致。经过自行调试可以正常运行,由于精力有限,暂不打算修改。)
项目结构:
项目代码:
mcc.py:为项目主控程序,控制项目主要流程
#-*- coding:utf-8 -*- import time from utils.mailhelper import mailHelper from utils.excutor import excutor from utils.configReader import configReader __Author__='LOMO' __Version__=1.0 class MCC(object): CONFIGPATH='_config.ini' KEY_COMMAND='Command' KEY_OPEN='Open' KEY_BOSS='Boss' KEY_TIMELIMIT='timelimit' def __init__(self): self.mailHelper=mailHelper() self.configReader=configReader(self.CONFIGPATH) commandDict=self.configReader.getDict(self.KEY_COMMAND) #CMD命令字典 openDict=self.configReader.getDict(self.KEY_OPEN) #打开文件命令字典 self.timeLimit=int(self.configReader.readConfig(self.KEY_BOSS,self.KEY_TIMELIMIT)) self.excutor=excutor(commandDict,openDict) self.toRun() def toRun(self): while True: self.run() time.sleep(self.timeLimit) def run(self): mailBody=self.mailHelper.acceptMail() if mailBody: exe=self.mailHelper.analysisMail(mailBody) if exe: self.excutor.excute(exe) if __name__=='__main__': mcc=MCC()
_config.ini:配置文件,其中存放了,奴隶邮箱,boss邮箱的信息等
[Slave] pophost=pop.sina.com smtphost=smtp.sina.com port=25 username=xxx@sina.com password=xxxxxx [Boss] mail=xxx@qq.com timelimit=20 [Command] dir=dir [Open] music=E:CloudMusicCarly Rae Jepsen - Call Me Maybe.mp3 notepad=notepad
xxx.log:日志文件,由程序自动生成
2017-02-03 10:22:20,394 INFO 开始登录邮箱 2017-02-03 10:22:21,341 INFO 开始配置发件箱 2017-02-03 10:22:35,490 INFO 发件箱配置成功 2017-02-03 10:22:35,493 INFO 开始抓取邮箱 2017-02-03 10:22:36,461 INFO 抓取邮箱成功 2017-02-03 10:22:36,463 INFO 开始抓取subject和发件人
configReader.py:用于读取配置文件
#-*- coding:utf-8 -*- import os,sys import ConfigParser class configReader(object): def __init__(self,configPath): configFile=os.path.join(sys.path[0],configPath) self.cReader=ConfigParser.ConfigParser() self.cReader.read(configFile) def readConfig(self,section,item): #获取单元内容 return self.cReader.get(section,item) def getDict(self,section): #获取项目内容 commandDict={} items=self.cReader.items(section) for key,value in items: commandDict[key]=value return commandDict
excutor.py:用于执行命令的程序,
#-*- coding:utf-8 -*- import os,win32api from mccLog import mccLog from mailhelper import mailHelper class excutor(object): def __init__(self,commandDict,openDict): self.mccLog=mccLog() self.commandDict=commandDict self.openDict=openDict self.mailHelper=mailHelper() def excute(self,exe): #执行邮件 subject=exe['subject'].strip() self.mccLog.mccWriteLog(u'开始处理命令') print exe if subject in self.commandDict: self.mccLog.mccWriteLog(u'执行命令') try: command=self.commandDict[subject] os.system(command) self.mailHelper.sendMail('pass', 'Slave') self.mailHelper.sendMail('Success','Boss') self.mccLog.mccWriteLog(u'执行命令成功') except Exception,e: self.mccLog.mccError(u'执行命令失败'+str(e)) self.mailHelper.sendMail('error','Boss',e) elif subject in self.openDict: self.mccLog.mccWriteLog(u'打开文件') try: openFile=self.openDict[subject] win32api.ShellExecute(0,'open',openFile,'','',1) self.mailHelper.sendMail('pass', 'Slave') self.mailHelper.sendMail('Success','Boss') self.mccLog.mccWriteLog(u'打开文件成功') except Exception,e: self.mccLog.mccError(u'打开文件失败'+str(e)) else: pass # self.mailHelper.sendMail('error','Boss','no such command')
mailHelper.py:关于邮箱的一系列操作,例如登录邮箱,分析邮件,发送邮件等
#-*- coding=utf-8 -*- from email.mime.text import MIMEText from configReader import configReader from mccLog import mccLog import poplib import smtplib import re class mailHelper(object): CONFIGPATH='_config.ini' def __init__(self): self.mccLog=mccLog() cfReader=configReader(self.CONFIGPATH) self.pophost=cfReader.readConfig('Slave','pophost') self.smtphost=cfReader.readConfig('Slave','smtphost') self.port=cfReader.readConfig('Slave','port') self.username=cfReader.readConfig('Slave','username') self.password=cfReader.readConfig('Slave','password') self.bossMail=cfReader.readConfig('Boss','mail') self.configSlaveMail() def loginMail(self): #登录邮箱 self.mccLog.mccWriteLog(u'开始登录邮箱') try: self.pp=poplib.POP3_SSL(self.pophost) self.pp.set_debuglevel(0) #是否显示debug信息 self.pp.user(self.username) self.pp.pass_(self.password) self.pp.list() #尝试所列出邮件 print u'登陆成功' except Exception,e: print u'登录失败' self.mccLog.mccError(u'登录邮箱失败'+str(e)) exit() def acceptMail(self): #收取邮件 self.loginMail() self.mccLog.mccWriteLog(u'开始抓取邮箱') try: ret=self.pp.list() mailBody=self.pp.retr(len(ret[1])) self.mccLog.mccWriteLog(u'抓取邮箱成功') return mailBody except Exception,e: self.mccLog.mccError(u'抓取邮箱失败'+str(e)) return None def analysisMail(self,mailBody): #分析邮件,获取发件人以及命令 self.mccLog.mccWriteLog(u'开始抓取subject和发件人') try: subject=re.findall("Subject:(.*?)',",str(mailBody[1]).decode('utf-8'),re.S) print subject subject=subject[1] print subject sender =re.search("X-Sender:(.*?)',",str(mailBody[1]).decode('utf-8'), re.S).group(1) command={'subject':subject,'sender':sender} self.mccLog.mccWriteLog(u'抓取subject和发件人成功') return command except Exception,e: self.mccLog.mccError(u'抓取subject和发件人失败'+str(e)) return None def configSlaveMail(self): #配置发件箱 self.mccLog.mccWriteLog(u'开始配置发件箱') try: self.handle=smtplib.SMTP(self.smtphost,self.port) self.handle.login(self.username,self.password) self.mccLog.mccWriteLog(u'发件箱配置成功') except Exception,e: self.mccLog.mccError(u'发件箱配置失败'+str(e)) exit() def sendMail(self,subject,receiver,body='Success'): #发送邮件 self.loginMail() msg=MIMEText(body,'plain','utf-8') msg['Subject']=subject msg['from']=self.username self.mccLog.mccWriteLog(u'开始发送邮件'+' to '+receiver) if receiver=='Slave': try: self.handle.sendmail(self.username,self.username,msg.as_string()) self.mccLog.mccWriteLog(u'发送邮箱成功') return True except Exception,e: self.mccLog.mccError(u'发送邮件失败'+str(e)) return False elif receiver== 'Boss': try: self.handle.sendmail(self.username,self.bossMail,msg.as_string()) self.mccLog.mccWriteLog(u'发送邮件成功') except Exception,e: self.mccLog.mccError(u'发送邮件失败'+str(e)) return False if __name__=="__main__": mail=mailHelper() body=mail.acceptMail() print mail.analysisMail(body) mail.sendMail('test','Boss')
mccLog.py:用于生产日志文件
#-*- coding:utf-8 -*- import logging from datetime import datetime class mccLog(object): def __init__(self): logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', detafmt='%Y-%m-%d %H:%M:%S', filename=datetime.now().strftime('%Y%m%d%H%M%S')+'.log', filemode='a') def mccWriteLog(self,logContent): #记录日志 logging.info(logContent) def mccError(self,errorContent): #记录报错日志 logging.error(errorContent)