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程序代码的几种方法总结
Apr 28 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
详解Django通用视图中的函数包装
Jul 21 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
Python实现感知机(PLA)算法
Dec 20 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
在双python下设置python3为默认的方法
Oct 31 Python
浅谈python3中input输入的使用
Aug 02 Python
解决python replace函数替换无效问题
Jan 18 Python
详解Flask前后端分离项目案例
Jul 24 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/04/28 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
2017/05/02 PHP
use jscript List Installed Software
2007/06/11 Javascript
input 高级限制级用法
2009/03/26 Javascript
js Flash插入函数免激活代码
2009/03/31 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python 检查是否为中文字符串的方法
2018/12/28 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
Python中six模块基础用法
2019/12/08 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
假面舞会策划方案
2014/05/29 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python