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()则是退出邮箱

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

详情欢迎关注微信公众号孤独的s

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值