Python功能强大,简单易学,很多人不知道如何学习,觉得学习很枯燥。其实趣味学习是最好的方法,比如,你经常忘记关闭办公室的电脑,又不想半路返回单位,就可以用python写一个远程操控的自动关机程序,试想一下,当你掏出手机进行几步简单的操作就可以实现对其他电脑的远程控制,是不是很酷!
要点:
- 通过邮件的自动接收与发送实现对目标电脑的远程操控
- 首先在目标电脑上建立一个监听线程用来实时接收邮件
- 当使用手机对邮箱发送关闭电脑相关主题邮件时
- 目标电脑就会读取邮件主题文字作为指令并执行
- 以实现自动关机的目的
一.邮件收发
用于接收和发送邮件的邮箱可任意指定(可以是同一邮箱),不过要想使用邮箱的自动收发功能,还需要生成特定的授权码,一般来说QQ、163等邮箱都支持此类操作。以QQ邮箱为例,可以在“设置—账户”页面进行设置(下图) (1)邮件接收 首先要明确用于接收邮件的地址ADDR、对应的16位授权码PASSWORD以及接收邮件服务POP_SERVERADDR = '*********@qq.com'
PASSWORD = '****************'
POP_SERVER = 'pop.qq.com'
def pop_connect(self):
try:
self.reademail = poplib.POP3_SSL(self._pop_server)
self.reademail.user(self._addr)
self.reademail.pass_(self._password)
self.allemail = self.reademail.stat()
except: print('读取邮件登录失败') exit()
def receive_email(self):
self.pop_connect()
topemail = self.reademail.top(self.allemail[0], 0)
emaillist = []
for item in topemail[1]:
try:
emaillist.append(item.decode('utf8'))
except: try:
emaillist.append(item.decode('gbk'))
except:
emaillist.append(item.decode('big5'))
emailmsg = email.message_from_string('n'.join(emaillist))
emailsub = email.header.decode_header(emailmsg['subject'])
if emailsub[0][1]:
submsg = emailsub[0][0].decode(emailsub[0][1])
else:
submsg = emailsub[0][0]
return submsg
(代码可以左右滑动)
(2)邮件发送接下来再说一下邮件的自动发送,至于为什么需要设置邮件自动发送功能后面会讲到,这里暂时不提。与邮件接收功能类似,自动发送邮件需要提供用于发送邮件的邮箱地址FROM_ADDR、授权码PASSWORD、目标 邮件地址ADDR以及邮件发送服务SMTP_SERVERPASSWORD = '****************'
FROM_ADDR = '*********@qq.com'
ADDR = '*********@qq.com'
SMTP_SERVER = 'smtp.qq.com'
def smtp_connect(self):
try:
self.sendemail = smtplib.SMTP_SSL(self._smtp_server, 465)
self.sendemail.login(self._addr, self._password)
except:
print('发送邮件登录失败') exit()
(代码可以左右滑动)
相对邮件接收来说,发送邮件不需要进行编码格式转换,只需要按照特定格式设置邮件内容msg并发送即可def send_email(self):
self.smtp_connect()
msg = MIMEText('')
msg['Subject'] = '设置完毕'
msg['From'] = self._from_addr
msg['To'] = self._addr
self.sendemail.sendmail(self._from_addr, self._addr, msg.as_string()) self.sendemail.close()
(代码可以左右滑动)
二.关机设置
现在开始设计我们的核心功能来实现自动关机,针对自动接收到的邮件标题文本进行关键字识别,由于这里的关键字完全是自己指定的,所以说这部分的自由度非常之高,我们完全可以根据自身的需求和习惯设置任意关键字作为执行指令,比如我在这里设置了两种指令:
- “延时关机 XX”关键字:触发shutdown指令,使目标电脑在XX秒后关机,默认在60秒后关机。
- “定时关机 XX:XX”关键字:触发schtasks指令,使目标电脑在每天的XX时XX分关机,默认在00:00(零点) 关机。
def check_shutdown(self):
submsg_list = self.receive_email().split()
print('最新邮件主题:', ' '.join(submsg_list))
sd_type = submsg_list[0]
if sd_type == '延时关机':
sd_time = '60'
if len(submsg_list) > 1:
sd_time = submsg_list[1]
command = 'shutdown -s -t ' + sd_time
elif sd_type == '定时关机':
sd_time = '00:00'
if len(submsg_list) > 1:
sd_time = submsg_list[1]
command = 'schtasks /create /TN %s /ST %s /sc DAILY /TR "shutdown /s"' %(sd_type, sd_time)
if '关机' in sd_type:
os.system(command)
print('执行命令:', command)
self.reademail.quit()
return True
else:
return False
(代码可以左右滑动)
三.实例演示
目前为止几个主要的功能模块都构建完毕了,接下来我们对其进行整合:1).按照本文开头所讲的设计思路,需要持续监测目标邮箱中的最新邮件,如果发现关机关键字则执行对应的关机指令,考虑到邮件发送的网络延时这里对每次监测之间设置了一个5秒的时间间隔。2).另外,为了避免同一封包含关机指令的邮件被反复读取执行,还需要在关机命令执行后自动发送一封不包含关机指令的新邮件对其进行覆盖,这就是设置邮件自动发送功能的原因,实现代码 如下:
def main():
mail = Email()
while True:
time.sleep(5)
print('等待关机信号.....') if mail.check_shutdown(): mail.send_email()