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 contentelse:print('%sAttachment: %s' % ('  ' * indent, content_type))

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

另外,涉及的解析函数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.png"):# 构造附件1,传送当前目录下的 test.txt 文件att1 = MIMEText(open('./screenshot.png', 'rb').read(), 'base64', 'utf-8')att1["Content-Type"] = 'application/octet-stream'# 这里的filename可以任意写,写什么名字,邮件中显示什么名字att1["Content-Disposition"] = 'attachment; filename="screenshot.png"'message.attach(att1)try:smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信, 端口一般是465smtpObj.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 = 0result = 'Nothing happen.'if 'screenshot' in cmd:img = pyautogui.screenshot()img.save('./screenshot.png')kind = 1if '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 + linekind = 3if dos_result != '':result = dos_resultreturn kind, result

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

0x03 实验结果

发送邮箱查询本机ip地址

收到的反馈如下:

python 通过邮件控制电脑 实现远程控制相关推荐

  1. Python 远程(邮件)控制电脑升级版

    由于前边 http://blog.csdn.net/u013511642/article/details/44259557写的远程操控电脑,使用的POP登陆有使用频率限制,导致非常被动,有时候邮件无法 ...

  2. python控制电脑程序,Python简单实现控制电脑的方法

    本文实例讲述了Python简单实现控制电脑的方法.分享给大家供大家参考,具体如下: 1.windows 下,CMD的一些命令: dir:列出当前的所有文件 time:打印当前的时间 tree:列出当前 ...

  3. python控制电脑屏幕_Python简单实现控制电脑的方法

    本文实例讲述了Python简单实现控制电脑的方法.分享给大家供大家参考,具体如下: 1.windows 下,CMD的一些命令: dir:列出当前的所有文件 time:打印当前的时间 tree:列出当前 ...

  4. Python 实战系列-微信或网页远程控制电脑

    Python 实战系列-微信或网页远程控制电脑 本系列课程为Python实战系列课程:使用微信控制电脑,使用Python的Web框架Flask搭建网页, 并使用网页控制电脑:使用wxPython编写图 ...

  5. csgo怎么控制电脑玩家_图文详解电脑怎么发起远程控制

    当我们需要他人进行控制自己的电脑从而来实现电脑的演示再者是维修操作时,会往往都会通过过远程控制来实现.那么要如何才能实现远程控制呢?下面小编就来将操作方法来分享给大家伙. 最近小编发现有小伙伴想知道电 ...

  6. python操作微信电脑版_Python使用itchat模块实现简单的微信控制电脑功能示例

    本文实例讲述了Python使用itchat模块实现简单的微信控制电脑功能.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding=UTF-8 import request ...

  7. python 微信模块_Python使用itchat模块实现简单的微信控制电脑功能示例

    本文实例讲述了python使用itchat模块实现简单的微信控制电脑功能.分享给大家供大家参考,具体如下: #!/usr/bin/python #coding=UTF-8 import request ...

  8. 控制电脑_用小程序远程控制电脑

    远程控制软件,大家已经见过很多了,比如说我们之前介绍过的 Remote Utilities.AnyDesk 等等,但是我今天介绍的这款与其他的有点与众不同. 今天登场的是一款名叫 HiPC 移动助手的 ...

  9. 微信可以远程控制电脑吗_上车| 手机远程控制手机,还可以控制电脑

    对于一个经常使用电脑学习/工作的人来说,每天都要坐在电脑前敲敲这个,点点那个,但是总有比较懒或者有其他事情要走开的时候,这个时候,你是选择硬撑到完成电脑上正在做的事情?还是选择抱着电脑开着热点随时移动 ...

最新文章

  1. python3 字符串、十六进制字符串、数字、字节之间的转换
  2. Linux中的中断处理
  3. 更新 Ubuntu 系统,避免报错「校验和不符」
  4. 揭开雷达的面纱(科普)接收机
  5. Nginx基础——Rewrite规则
  6. 年薪35万的深度学习工程师,正面临数百万的人才缺口
  7. GAN之再进化:分布判别器,大连理工提出一种新式无监督图像合成方法
  8. State_状态模式_PHP语言描述
  9. python通过解释器内置的open_Python 之 文件读写的学习
  10. Javafx 报错Exception in Application start method java.lang.reflect.InvocationTargetException
  11. php去掉指定字符串,php如何删除字符串中的指定字符串
  12. UWB定位/RSSI定位 三边测量法trilateration C语言代码详解
  13. css margin为什么重叠,CSS 外边距(margin)重叠及防止方法
  14. C++string用法
  15. Searchcode: 源代码搜索利器
  16. Marlin中的Polynomial commitment scheme
  17. 【PP-1】定义生产计划参数文件
  18. 在word中怎么把文字往下挪挪_word流程图中的文字怎样统一调整其大小字...
  19. 全球手机处理器架构进化论:从ARM9到A15
  20. 随机数生成器(结绳中文app编程)

热门文章

  1. 化学气相沉积CVD工艺中MKS下游排气高速节流阀的国产化替代方案及产品
  2. win7计算机管理员权限才能删除,Win7系统需要管理员权限才能删除文件夹或复制到此文件夹解决方法...
  3. 服务器销售笔记,关于共享服务器的读书笔记
  4. uniapp 条件编译的使用
  5. ae安装失败计算机丢失,AE安装失败的原因你真知道吗 ?正确的安装AE软件
  6. OC直升机公司否认对科比坠机事故负有任何责任
  7. 从产品看产品设计---定位
  8. 每位设计师都应该拥有的50个CSS代码片段
  9. 奔跑吧小恐龙java代码_【scratch2】-基本操作和奔跑吧恐龙案例
  10. RHEL8/CentOS8中文输入法