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 相关文章推荐
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
详解Django框架中的视图级缓存
Jul 23 Python
python opencv 图像尺寸变换方法
Apr 02 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
python检测主机的连通性并记录到文件的实例
Jun 21 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
Python多进程编程常用方法解析
Mar 26 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
Python Django获取URL中的数据详解
Nov 01 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实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
英语课外活动总结
2014/08/27 职场文书
伏羲庙导游词
2015/02/09 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电