Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)


Posted in Python onNovember 19, 2019

0. 我们如何通过邮件系统完成远程控制电脑(关机、重启等)?

实现思路:

需要有两个邮箱:接收指令邮箱(A)发送指令邮箱(B)

被控制的电脑(查看 A 邮箱):
1. 每隔指定时间监听 A 邮箱 查看最近的邮件
2. 打开最近邮件,看是否是 B 邮箱地址发来的执行命令
3. 向 A 和 B 邮箱都发送 主题为:反馈 内容为:“目标计算机已收到指令!开始执行:xxx 指令!” 邮件
4. 执行指定邮箱发送的执行命令

远程人员操作:

登录 B 邮箱,向 A 邮箱发送 主题为:“目标计算机执行” 内容为:xxx指令(例如:关机)

1. 代码编写

import poplib
import smtplib
import os
import time
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
from email.mime.text import MIMEText
from email.header import Header
 
email_params = dict()
email_params['email_message'] = '反馈'
email_params['email_subject'] = '目标计算机反馈'
email_params['email_from'] = 'A邮箱'
email_params['email_user'] = 'A邮箱'
email_params['email_exec'] = 'B邮箱'
email_params['email_to'] = ['A邮箱', 'B邮箱']
email_params['email_smtp'] = 'smtp.163.com'
email_params['email_pop'] = 'pop.163.com'
email_params['email_pass'] = 'A邮箱的密码(smtp、pop3的密码)'
interval_time = 5
 
 
def decode_str(s):
  value, charset = decode_header(s)[0]
  if charset:
    value = value.decode(charset)
  return value
 
 
def get_headers(message):
  headers = dict()
  for header in ['From', 'To', 'Subject']:
    value = message.get(header, '')
    if value:
      if header == 'Subject':
        headers['Subject'] = decode_str(value)
      elif header == 'From':
        hdr, addr = parseaddr(value)
        headers['From'] = decode_str(addr)
      elif header == 'To':
        hdr, addr = parseaddr(value)
        headers['To'] = decode_str(addr)
  return headers
 
 
def guess_charset(message):
  charset = message.get_charset()
  if charset is None:
    content_type = message.get('Content-Type', '').lower()
    pos = content_type.find('charset=')
    if pos >= 0:
      charset = content_type[pos + 8:].strip()
  return charset
 
 
def get_content(message):
  for part in message.walk():
    content_type = part.get_content_type()
    charset = guess_charset(part)
    if content_type == 'text/plain' and charset:
      try:
        return part.get_payload(decode=True).decode(charset)
      except AttributeError:
        print('type error')
      except LookupError:
        print("unknown encoding: utf-8")
 
 
def receive_email():
  email_server = poplib.POP3_SSL(email_params['email_pop'])
  email_server.user(email_params['email_user'])
  email_server.pass_(email_params['email_pass'])
  resp, mails, octets = email_server.list()
  index = len(mails)
  if index == 0:
    return None, None
  resp, lines, octets = email_server.retr(index)
  message = b'\r\n'.join(lines).decode('utf-8', 'ignore')
  message = Parser().parsestr(message)
  email_server.quit()
  return get_headers(message), get_content(message)
 
 
def send_email(email_message):
  message = MIMEText(email_message, 'plain', 'utf-8')
  message['Subject'] = Header(email_params['email_subject'], 'utf-8')
  message['From'] = Header(email_params['email_from'])
  message['To'] = Header(','.join(email_params['email_to']), 'utf-8')
 
  email_server = smtplib.SMTP_SSL(email_params['email_smtp'])
  email_server.login(email_params['email_from'], email_params['email_pass'])
  email_server.sendmail(email_params['email_from'], email_params['email_to'], message.as_string())
  email_server.close()
 
 
def exec_operator(exec_content):
  if exec_content == '关机':
    os.system("shutdown -s -t 1")
  elif exec_content == '重启':
    os.system("shutdown -r")
  else:
    os.system(exec_content)
 
 
if __name__ == '__main__':
  while True:
    headers, content = receive_email()
    if headers and content and headers['From'] == email_params['email_exec'] and headers['Subject'] == '目标计算机执行':
      email_message = "目标计算机已接收到指令!开始执行: " + content + " 指令!"
      send_email(email_message)
      exec_operator(content)
    time.sleep(interval_time)

2. 解释说明

A 邮箱:是 163 邮箱,需要开启 smtp、pop3 服务

Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

上面所说的 smtp、pop3 密码,指的是开启上图所示的服务要设定的密码!!!

B 邮箱:是 QQ 邮箱,只是用来发送执行命令到 A 邮箱的,所以不必开启 smtp、pop2 服务

3. 运行截图

B 邮箱向 A 邮箱发送命令 ?

Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

B 邮箱从 A 邮箱接收到的反馈邮件 ?

Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

至于关机的画面,就不展示了,大家自己运行后尝试看吧!(*^_^*)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自定义主从分布式架构实例分析
Sep 19 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python获取对象属性的几种方式小结
Mar 12 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 #Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 #Python
Python算法中的时间复杂度问题
Nov 19 #Python
wxPython窗体拆分布局基础组件
Nov 19 #Python
Python解压 rar、zip、tar文件的方法
Nov 19 #Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 #Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 #Python
You might like
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
yii框架builder、update、delete使用方法
2014/04/30 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
JQuery 文本框使用小结
2010/05/22 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
使用python存储网页上的图片实例
2018/05/22 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
动态密码技术
2012/10/18 面试题
电气工程师岗位职责
2014/01/01 职场文书
给校长的建议书400字
2014/05/15 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
关于群众路线的心得体会
2014/11/05 职场文书
健康证明
2015/06/19 职场文书
2015暑假假期总结
2015/07/13 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
数学复习课教学反思
2016/02/18 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript