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的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
Python反转序列的方法实例分析
Mar 21 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python标准库之sqlite3使用实例
2014/11/25 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
SOA的常见陷阱或者误解是什么
2014/10/05 面试题
计算机专业推荐信范文
2013/11/27 职场文书
2014全国两会心得体会
2014/03/17 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
三人合伙协议书范本
2014/10/29 职场文书
家长反馈意见及建议
2015/06/03 职场文书
预备党员入党感想
2015/08/10 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android