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 29 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python标准库之itertools库的使用方法
Sep 07 Python
Django中间件实现拦截器的方法
Jun 01 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
Python加速程序运行的方法
Jul 29 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
python FTP编程基础入门
Feb 27 Python
Python 如何解决稀疏矩阵运算
May 26 Python
OpenCV-Python实现油画效果的实例
Jun 08 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
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
javascript date格式化示例
2013/09/25 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
python 数据的清理行为实例详解
2017/07/12 Python
简单实现Python爬取网络图片
2018/04/01 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
关于python多重赋值的小问题
2019/04/17 Python
python获取地震信息 微信实时推送
2019/06/18 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Python实现简单的2048小游戏
2021/03/01 Python
一套SQL笔试题
2016/08/14 面试题
幼师自我鉴定范文
2013/10/01 职场文书
在职人员函授期间自我评价分享
2013/11/08 职场文书
项目投资意向书范本
2015/05/09 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
高三生物教学反思
2016/02/22 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书