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将unicode转为str的方法
Jun 21 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
基于Python实现的微信好友数据分析
Feb 26 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
python查询文件夹下excel的sheet名代码实例
Apr 02 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
python利用7z批量解压rar的实现
Aug 07 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
python实现随机加减法生成器
Feb 24 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
Python 在函数上添加包装器
Jul 28 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实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
utf8的编码算法 转载
2006/12/27 Javascript
javascript编程起步(第四课)
2007/02/27 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
django框架模板语言使用方法详解
2019/07/18 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
专升本自我鉴定
2013/10/10 职场文书
运动会广播稿400字
2014/01/25 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS