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登陆asp网站页面的实现代码
Jan 14 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
django 消息框架 message使用详解
Jul 22 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
Python中base64与xml取值结合问题
Dec 22 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
AUC计算方法与Python实现代码
Feb 28 Python
python绘制玫瑰的实现代码
Mar 02 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
python导入库的具体方法
Jun 18 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将数据导入到Foxmail
2006/10/09 PHP
php 禁止页面缓存输出
2009/01/07 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php生成rss类用法实例
2015/04/14 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
javascript eval函数深入认识
2009/02/21 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python3爬取各类天气信息
2018/02/24 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python实现简单猜单词游戏
2020/12/24 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
师德师风演讲稿
2014/05/05 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
中秋客户感谢信
2015/01/22 职场文书
百日宴上的祝酒词
2015/08/10 职场文书