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版微信红包分配算法
May 04 Python
使用Python写CUDA程序的方法
Mar 27 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python之Class&Object用法详解
Dec 25 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
python3下pygame如何实现显示中文
Jan 11 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
python办公自动化之excel的操作
May 23 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 Python
Python+DeOldify实现老照片上色功能
Jun 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
PHP&MYSQL服务器配置说明
2006/10/09 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python 生成目录树及显示文件大小的代码
2009/07/23 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
python 使用while循环输出*组成的菱形实例
2020/04/12 Python
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
酒店辞职信怎么写
2015/02/27 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL