专栏首页孤独的SPython—利用邮件控制电脑关机

Python—利用邮件控制电脑关机

具体实现的功能是这样的,用一个发送游戏A邮箱给接收邮箱发送邮件。

准备:

因此需要准备两个邮箱,而且接收邮箱要开通imap,以qq邮箱为例,在设置中找到账户,然后下面有这么一个模块

开启那个IMAP/SMTP服务,这样便可以利用服务器接收到邮件,才能接收到邮件。

网上python接收邮件的方式有几种,有pop3,有imap

POP是指邮局协议,目的是让用户可以访问邮箱服务器中的邮件,允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

IMAP协议(Interactive Mail Access Protocol),即交互式邮件访问协议,与POP3的不同在于:开启了IMAP后,在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。

我这里使用的IMAP模块来接收邮件。

即使用IMAP模块,也有很多选择,一开始我是用imaplib来接收邮件,但是找不到方法来把接收的邮件删除,以便下次判断的时候不会还是之前的邮件,如果有人知道,也可以教教我。后来我发现了imapclient,

需要的模块,有一些需自行安装:

import time
import os,sys
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import getpass
from imapclient import IMAPClient
import pprint
import pyzmail

主要代码:

def gettheemail():
    username = '接收邮箱'
    passwd = '授权码'
    try:
        imapobj = IMAPClient('imap.qq.com', ssl=True)
    except:
        return 0
    try:
        imapobj.login(username, passwd)
    except Exception as e:
        return 0
    try:
        pprint.pprint(imapobj.list_folders())
    except:
        return 0
    imapobj.select_folder('INBOX', readonly=False)
    UIDS = []
    UIDS = imapobj.search(['UNSEEN'])
    rawmesage = imapobj.fetch(UIDS, ['BODY[]'])
    pprint.pprint(rawmesage)
    for uid in UIDS:
        message = pyzmail.PyzMessage.factory(rawmesage[uid][b'BODY[]'])
        if message.get_subject().startswith('sjw'):
            link = message.text_part.get_payload().decode(message.text_part.charset)
            imapobj.delete_messages(uid)
            subject = message.get_subject().encode('UTF-8')
            subject1 = subject.decode()
            #print(subject1)
            if link == "关机":
                sendtheback(link)
                os.system("shutdown -s -t 10")
imapobj.expunge()
imapobj.logout()
return 1

上面有一些部分其实是不用添加,不过我为了方便我在运行代码时知道哪里出错了,所以添加了很多繁琐的部分,到时可以自己按需删掉。

try:
    imapobj.login(username, passwd)
except Exception as e:
    return 0

这个就是登录邮箱,必须部分,而且尽量添加try,这样程序才能更加长久的运行。

try:
    pprint.pprint(imapobj.list_folders())
except:
    return 0

例如这个,我只是想看看它接收到的内容是什么,就差不多那些文件夹的内容

imapobj.select_folder('INBOX', readonly=False)
UIDS = []
UIDS = imapobj.search(['UNSEEN'])
rawmesage = imapobj.fetch(UIDS, ['BODY[]'])
pprint.pprint(rawmesage)

这里选择方法,在那些文件夹中找到INBOX,即使收件箱。

readonly = False的意思是可读可修改,如果给成TRUE的话则是只读,不能修改。

imapobj.search则是寻找收件箱里那些邮件,都是有标识的,例如UNSEEN——指的是通俗点,我们没有看过的读过的邮件

ALL--则是指所有邮件

UIDS则是每封邮件的id吧,然后我们可以利用这个id去读取这封邮件的内容。

imapobj.fetch--这个方法可以让我们找到这个id下的邮件的内容并保存起来。

for uid in UIDS:
    message = pyzmail.PyzMessage.factory(rawmesage[uid][b'BODY[]'])
    if message.get_subject().startswith('特定的邮件的主题'):
        link = message.text_part.get_payload().decode(message.text_part.charset)
        imapobj.delete_messages(uid)
        subject = message.get_subject().encode('UTF-8')
        subject1 = subject.decode()
        #print(subject1)
        if link == "关机":
            sendtheback(link)
            os.system("shutdown -s -t 10")

这里则是遍历一下获取的到的id,

message = pyzmail.PyzMessage.factory(rawmesage[uid][b'BODY[]'])

邮件的格式比较特殊,因此需要转码一下,

下面的就是判断,如果邮件的主题与你设置的邮件的主题一样,便可以接收邮件的正文。

然后在获取正文的内容,像我那样,如果正文的内容等于关机,然后调用关机模块。

imapobj.expunge()
imapobj.logout()
return 1

这几句,第一句则是把上面标记过的邮件删除掉,这样下次读取邮箱的时候就不会重复之前的内容了

然后logou()则是退出邮箱

这样利用邮箱接收邮件的程序大致就差不多成型了,这样就可以远程实现电脑关机,做成后台脚本。

——————人生苦短,我用python

本文分享自微信公众号 - 孤独的S(sjw_980305),作者:sjw

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python---图解你的好友分布情况

    很久之前做了查看微信的好友分布,但是碍于当时的数据可视化有一个巨坑,网上的教程都是互相转发,互相复制的,最后并不能实现操作,这次想要来填坑,所以记录一下。

    sjw1998
  • 如何做一个任何电脑都能用的python程序?

    有时候你做好了一个小游戏或者小程序想要打包发送给别人玩或者用的时候,直接发过去,如果别人没有python环境的话,那肯定是用不了的,这时候你需要将程序打包成e...

    sjw1998
  • python之模拟键盘

    对于python来说,模拟键盘的方式据我了解有三种方式,其中有pyuserinput,win32api,以及winio。

    sjw1998
  • Prose:Github所见即所得站点编辑器

    最近才发现一个基于Github Pages的Jekyll内容编辑器Prose,感觉内容编辑更快、发布什么的更方便,所以想推荐给使用github的友友们,以前都是...

    wblearn
  • iOS 开发:『Crash 防护系统』(一)Unrecognized Selector

    APP 的崩溃问题,一直以来都是开发过程中重中之重的问题。日常开发阶段的崩溃,发现后还能够立即处理。但是一旦发布上架的版本出现问题,就需要紧急加班修复 BUG,...

    行走少年郎
  • 面试常问的深度学习(DNN、CNN、RNN)的相关问题

    神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。增加节点数:增加维度,即增加线性转换能力...

    机器学习AI算法工程
  • 能源能耗及配电监测管理系统建设效益

    能源管理信息化/自动化在企业信息管理系统中站有举足轻重的地位,这也是由能源在企业生产运营中的重要性所决定的。能源是所有现代企业赖以生存的基础性资源和前提条件,同...

    用户2945713
  • 你所不知的Webpack-多种配置方法

    ? 除了通过最常见的导出一个 Object 来描述 Webpack 所需的配置外,还有其它更灵活的方式,以简化不同场景的配置。 下面来一一介绍它们。 导出一个...

    IMWeb前端团队
  • 18.路由的嵌套

    玩蛇的胖纸
  • 你所不知的Webpack-多种配置方法

    除了通过最常见的导出一个 Object 来描述 Webpack 所需的配置外,还有其它更灵活的方式,以简化不同场景的配置。 下面来一一介绍它们。

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券