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分析apache访问日志脚本分享
Feb 26 Python
Python 的描述符 descriptor详解
Feb 27 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
python实现视频分帧效果
May 31 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
Jun 14 Python
tensorflow2.0保存和恢复模型3种方法
Feb 03 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 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
php中常用的预定义变量小结
2012/05/09 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
Python语言异常处理测试过程解析
2020/01/08 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
房地产销售计划书
2014/01/10 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
小学生感恩老师演讲稿
2014/08/28 职场文书
民间个人借款协议书
2014/09/30 职场文书
大学团日活动总结书
2015/05/11 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis