前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python—利用邮件控制电脑关机

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

作者头像
sjw1998
发布2019-09-28 13:13:30
8630
发布2019-09-28 13:13:30
举报
文章被收录于专栏:孤独的S孤独的S孤独的S

具体实现的功能是这样的,用一个发送游戏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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 孤独的S 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档