Python邮件操作实例:发个邮件用Python实现远程自动关机

一.邮件收发

用于接收和发送邮件的邮箱可任意指定(可以是同一邮箱),不过要想使用邮箱的自动收发功能,还需要生成特定的授权码,一般来说QQ、163等邮箱都支持此类操作。以QQ邮箱为例,可以在“设置—账户”页面进行设置(下图)

image

(1)邮件接收

首先要明确用于接收邮件的地址ADDR、对应的16位授权码PASSWORD以及接收邮件服务POP_SERVER

ADDR = '*********@qq.com'
PASSWORD = '****************'
POP_SERVER = 'pop.qq.com'

连接到POP服务器:

def pop_connect(self):
   try:
       self.reademail = poplib.POP3_SSL(self._pop_server)
       self.reademail.user(self._addr)
       self.reademail.pass_(self._password)
       self.allemail = self.reademail.stat()
except: print('读取邮件登录失败') exit()

提取当前收件箱中最新的一封邮件,由于邮件数据是经过编码的,这里我们依次尝试utf8、gbk、big5三种编码格 式进行解码,并提取邮件标题部分数据

其中emailsub通常包括两个信息,一个是编码后的标题文本数据,另一个 是其编码格式,所以我们还需要再进行一次解码,这时获得的才是真正可用的标题文本数据。

def receive_email(self):
   self.pop_connect()
   topemail = self.reademail.top(self.allemail[0], 0)
   emaillist = []
   for item in topemail[1]:
       try:
           emaillist.append(item.decode('utf8'))
except: try:
               emaillist.append(item.decode('gbk'))
           except:
               emaillist.append(item.decode('big5'))
   emailmsg = email.message_from_string('\n'.join(emaillist))
   emailsub = email.header.decode_header(emailmsg['subject'])
   if emailsub[0][1]:
       submsg = emailsub[0][0].decode(emailsub[0][1])
   else:
       submsg = emailsub[0][0]
   return submsg

(代码可以左右滑动)

(2)邮件发送

接下来再说一下邮件的自动发送,至于为什么需要设置邮件自动发送功能后面会讲到,这里暂时不提。

与邮件接收功能类似,自动发送邮件需要提供用于发送邮件的邮箱地址FROM_ADDR、授权码PASSWORD、目标 邮件地址ADDR以及邮件发送服务SMTP_SERVER

PASSWORD = '****************'
FROM_ADDR = '*********@qq.com'
ADDR = '*********@qq.com'
SMTP_SERVER = 'smtp.qq.com'

然后连接SMTP服务:

def smtp_connect(self):
   try:
       self.sendemail = smtplib.SMTP_SSL(self._smtp_server, 465)
       self.sendemail.login(self._addr, self._password)
   except:
print('发送邮件登录失败') exit()

(代码可以左右滑动)

相对邮件接收来说,发送邮件不需要进行编码格式转换,只需要按照特定格式设置邮件内容msg并发送即可

def send_email(self):
self.smtp_connect()
msg = MIMEText('')
msg['Subject'] = '设置完毕'
msg['From'] = self._from_addr
msg['To'] = self._addr
self.sendemail.sendmail(self._from_addr, self._addr, msg.as_string()) self.sendemail.close()

(代码可以左右滑动)

二.关机设置

现在开始设计我们的核心功能来实现自动关机,针对自动接收到的邮件标题文本进行关键字识别,由于这里的关键字完全是自己指定的,所以说这部分的自由度非常之高,我们完全可以根据自身的需求和习惯设置任意关键字作为执行指令,比如我在这里设置了两种指令:

  • “延时关机 XX”关键字:触发shutdown指令,使目标电脑在XX秒后关机,默认在60秒后关机。

  • “定时关机 XX:XX”关键字:触发schtasks指令,使目标电脑在每天的XX时XX分关机,默认在00:00(零点) 关机。

如果接收到有效邮件并执行了关机相关操作则返回True,否则返回False。代码如下:

def check_shutdown(self):
       submsg_list = self.receive_email().split()
       print('最新邮件主题:', ' '.join(submsg_list))
       sd_type = submsg_list[0]
       if sd_type == '延时关机':
           sd_time = '60'
           if len(submsg_list) > 1:
                   sd_time = submsg_list[1]
           command = 'shutdown -s -t ' + sd_time
       elif sd_type == '定时关机':
           sd_time = '00:00'
           if len(submsg_list) > 1:
                   sd_time = submsg_list[1]
           command = 'schtasks /create /TN %s /ST %s /sc DAILY /TR "shutdown /s"' %(sd_type, sd_time) 
       if '关机' in sd_type:
           os.system(command)
           print('执行命令:', command)
           self.reademail.quit()
           return True
       else:
           return False

(代码可以左右滑动)

三.实例演示

目前为止几个主要的功能模块都构建完毕了,接下来我们对其进行整合:

1).按照本文开头所讲的设计思路,需要持续监测目标邮箱中的最新邮件,如果发现关机关键字则执行对应的关机指令,考虑到邮件发送的网络延时这里对每次监测之间设置了一个5秒的时间间隔。

2).另外,为了避免同一封包含关机指令的邮件被反复读取执行,还需要在关机命令执行后自动发送一封不包含关机指令的新邮件对其进行覆盖,这就是设置邮件自动发送功能的原因,实现代码 如下:

def main():
   mail = Email()
   while True:
       time.sleep(5)
print('等待关机信号.....') if mail.check_shutdown(): mail.send_email()

现在我们进行实际操作测试,首先在目标电脑中运行程序,通过手机向目标邮箱发送一个主题名为"延时关机"的邮 件,会发现系统弹出“1分钟内关机”的提示,证明延时关机功能没有问题。

image

然后测试一下定时关机功能,同样向目标邮箱发送主题名为“定时关机 12:30”的邮件,打开系统的任务计划程序, 会发现多了一个定时关机的计划任务,说明定时关机功能也是成功的。

image

其实整个思路非常简单,跟我们上次的Python量化文章类似都是利用Python的smtp,email和poplib模块来监控我们的邮箱,然后提取关键字进行处理,非常有趣。上面只是抛砖引玉,大家可以发散增加很多功能!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容