本次实现的是一个通过邮件来远程控制电脑,以达到某些远程操作,例如让电脑执行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:\CloudMusic\Carly 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)