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利用flask sqlalchemy实现分页效果
Aug 02 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python实现简单多人聊天室
Dec 11 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
python将数组n等分的实例
Dec 02 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
Python __slots__的使用方法
Nov 15 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
Python合并多张图片成PDF
Jun 09 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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中的Session对象如何使用
2015/09/25 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
js 与或运算符 || && 妙用
2009/12/09 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
vue全局使用axios的方法实例详解
2018/11/22 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python探索之pLSA实现代码
2017/10/25 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
numpy数组广播的机制
2019/07/12 Python
python实现拼图小游戏
2020/02/22 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
keras 权重保存和权重载入方式
2020/05/21 Python
Python新手学习函数默认参数设置
2020/06/03 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
中学家长会邀请函
2014/02/03 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫