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实现抓取页面上链接的简单爬虫分享
Jan 21 Python
Python简单进程锁代码实例
Apr 27 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
python开发前景如何
Jun 11 Python
如何使用python写截屏小工具
Sep 29 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
Django实现聊天机器人
May 31 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 Python
Python Matplotlib绘制动画的代码详解
May 30 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之第九天
2006/10/09 PHP
php GeoIP的使用教程
2011/03/09 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
php中Smarty模板初体验
2011/08/08 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
JS交换变量的方法
2015/01/21 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
vue组件横向树实现代码
2018/08/02 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
tensorflow获取变量维度信息
2018/03/10 Python
python实现汉诺塔算法
2021/03/01 Python
超简单的Python HTTP服务
2019/07/22 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
物理研修随笔感言
2014/02/14 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
大学生自荐信范文
2015/03/05 职场文书
运动会班级前导词
2015/07/20 职场文书
Python pandas求方差和标准差的方法实例
2021/08/04 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技