python 通过邮件控制实现远程控制电脑操作


Posted in Python onMarch 16, 2020

0x00 思路

之前在博客上看到了使用python通过微信的接口,与微信交互的方式来控制电脑的摄像头、开关机等。但是这种方式需要首先在python上登录自己的微信才可以,同时微信端也会有已经在网页端登录的字样,很显眼。因此想到了另外一种交互方式,通过邮件进行交互。

通过邮件的方式不要求用户实时在线,只需要程序隔一段时间扫描一下邮箱的新邮件即可。这种交互方式更为方便。其次,这种方式也更为隐蔽,不会干扰微信的使用。

0x01 需要用到的库

主要是python的一些用于收发邮件的库

import smtplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import poplib
import pyautogui
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os

0x02 具体实现

首先,实现邮件的读取功能。读取最新的一封邮件内容,这条内容中包含我们要做的事情,比如查询ip地址、获取屏幕截图等。

在获取内容之前,先将邮箱的登录等做好初始化

def email_init():
 email = 'xxxxx@qq.com' #登录的邮箱账号
 password = 'xxxxx' # 注意这里不是邮箱密码 是要登录的邮箱的授权码
 pop3_server = 'pop.qq.com'
 
 # 连接到POP3服务器:
 server = poplib.POP3_SSL(pop3_server, 995)
 server.set_debuglevel(0)
 server.user(email)
 server.pass_(password)
 resp, mails, octets = server.list()
 index = len(mails)
 resp, lines, octets = server.retr(index) # 这里index代表读取最后一封邮件 也就是第一封
 msg_content = b'\r\n'.join(lines).decode('utf-8')
 msg = Parser().parsestr(msg_content)
 
 return msg, server

要注意密码不是邮箱的密码,是授权码,具体获取方式可以百度。

随后就可以将进行邮件的读取了。

def print_info(msg, indent=0):
 if indent == 0:
 for header in ['From', 'To', 'Subject']:
 value = msg.get(header, '')
 if value:
 if header == 'Subject':
 value = decode_str(value)
 else:
 hdr, addr = parseaddr(value)
 name = decode_str(hdr)
 value = u'%s <%s>' % (name, addr)
 print('%s%s: %s' % (' ' * indent, header, value))
 
 if msg.is_multipart():
 parts = msg.get_payload()
 for n, part in enumerate(parts):
 print('%spart %s' % (' ' * indent, n))
 print('%s--------------------' % (' ' * indent))
 return print_info(part, indent + 1)
 else:
 content_type = msg.get_content_type()
 if content_type=='text/plain' or content_type=='text/html':
 content = msg.get_payload(decode=True)
 charset = guess_charset(msg)
 if charset:
 content = content.decode(charset)
 print('%sText: %s' % (' ' * indent, content))
 return content
 else:
 print('%sAttachment: %s' % (' ' * indent, content_type))

将上一步得到的msg参数传入到读取函数中,通过递归调用查询邮件内容并解码。其中涉及到递归调用中的输出问题,我再上一篇文章中有提到:https://3water.com/article/182761.htm

另外,涉及的解析函数decode_str()如下

def decode_str(s):
 value, charset = decode_header(s)[0]
 if charset:
 value = value.decode(charset)
 return value

在邮件中读取相关命令后,就是对命令执行,然后在通过邮件的形式反馈命令结果了。

这里以返回屏幕截图以及执行dos命令为例

def send_result(kind, result):
 # 第三方 SMTP 服务
 mail_host = "smtp.163.com"
 mail_user = "@163.com" #发送信息的邮箱 这里我是用的163邮箱
 mail_pass = "xxxxxxx" # 邮箱的授权码
 
 sender = 'xxxxxx@163.com' #发送方地址
 receivers = ['xxxxx@qq.com'] #收件地址
 
 if kind == 1: # 第一方式 反馈屏幕截图
 print('Sending screenshot.')
 # 创建一个带附件的实例
 message = MIMEMultipart()
 message['From'] = '<hacker_center@163.com>'
 message['To'] = '<niu5512@qq.com>'
 subject = 'Hacker Center reply'
 message['Subject'] = Header(subject, 'utf-8')
 
 # 邮件正文内容
 message.attach(MIMEText('Hacker Server replay', 'plain', 'utf-8'))
 
 if os.path.exists("./screenshot.jpg"):
 # 构造附件1,传送当前目录下的 test.txt 文件
 att1 = MIMEText(open('./screenshot.jpg', 'rb').read(), 'base64', 'utf-8')
 att1["Content-Type"] = 'application/octet-stream'
 # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
 att1["Content-Disposition"] = 'attachment; filename="screenshot.jpg"'
 message.attach(att1)
 try:
 smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 启用SSL发信, 端口一般是465
 smtpObj.login(mail_user, mail_pass) # 登录验证
 smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
 print("mail has been send successfully.")
 except smtplib.SMTPException as e:
 print(e)
 
 if kind == 2: #第二种方式 返回dos命令结果
 message = MIMEText(result, 'plain', 'utf-8')
 message['From'] = '<hacker_center@163.com>'
 message['To'] = '<niu5512@qq.com>'
 subject = 'Hacker Center reply'
 message['Subject'] = Header(subject, 'utf-8')
 smtpObj = smtplib.SMTP_SSL(mail_host, 465)
 smtpObj.login(mail_user, mail_pass)
 smtpObj.sendmail(sender, receivers, message.as_string())
 print("mail has been send successfully.")

其中执行dos命令的函数如下:

def manage_cmd(cmd):
 print('The command is:%s' % cmd)
 kind = 0
 result = 'Nothing happen.'
 
 if 'screenshot' in cmd:
 img = pyautogui.screenshot()
 img.save('./screenshot.jpg')
 kind = 1
 
 if 'dos cmd' in cmd:
 dos_result = ''
 index = cmd.find(':')
 cmd = cmd[index+1:]
 
 if os.system(cmd):
 result = 'command err.'
 else:
 info = os.popen(cmd)
 
 for line in info:
 dos_result = dos_result + line
 kind = 3
 if dos_result != '':
 result = dos_result
 
 return kind, result

传入的cmd参数就是解析出的邮件内容,通过判断邮件内容来进行邮件反馈。

0x03 实验结果

发送邮箱查询本机ip地址

python 通过邮件控制实现远程控制电脑操作

收到的反馈如下:

python 通过邮件控制实现远程控制电脑操作

总结

到此这篇关于python 通过邮件控制电脑实现远程控制电脑操作的文章就介绍到这了,更多相关python邮件远程控制电脑内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
如何运行Python程序的方法
Apr 21 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
python的pip安装以及使用教程
Sep 18 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
Python3 合并二叉树的实现
Sep 30 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
详解python变量与数据类型
Aug 25 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 Python
django中的数据库迁移的实现
Mar 16 #Python
django之从html页面表单获取输入的数据实例
Mar 16 #Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 #Python
Python Django view 两种return的实现方式
Mar 16 #Python
Python 统计位数为偶数的数字代码详解
Mar 15 #Python
使用pygame编写Flappy bird小游戏
Mar 14 #Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 #Python
You might like
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
JTrackBar水平拖动效果
2007/07/15 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Python 图片处理库exifread详解
2021/02/25 Python
10条PHP编程习惯
2014/05/26 面试题
Linux上比较文件的命令都有哪些
2012/02/24 面试题
留学自荐信写作方法
2014/01/27 职场文书
运动会稿件50字
2014/02/17 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
pandas进行数据输入和输出的方法详解
2022/03/23 Python