2025年6月4日 星期三 乙巳(蛇)年 三月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python自动获取邮箱验证码【下集】

时间:04-24来源:作者:点击数:

上集为大家讲解了Gmail的专用密码设置和IMAP的设置,接下来主要为大家展示一下代码的实现

邮件协议

  • 收取邮件有两种协议,POP3和IMAP,POP3相对于IMAP功能较少无法对邮件进行更深层次的操作,
  • 因此本文使用IMAP协议收取邮件。python提供了很多收邮件的模块,本文使用imaplib来接收邮件。

难点

  • 获得邮件不难,难点是如何解析邮件的内容,由于邮件内容的编码是不固定的,因此编码格式的选择影响着解析邮件内容的正确性
  • 重申一次:由于Gmail属于国外的邮箱所以在使用的时候一定要 ·科·学·上·网· 才能顺利运行。
  • import imaplib
  • import email
  • import re
  • class receive_gmail:
  • def __init__(self):
  • self.emailuser = "【Gmail邮箱】"
  • self.emailpasswd = "【专用密码】"
  • self.imapserver = 'imap.gmail.com'
  • self.imapport = 993 # IMAP协议专用端口,该端口可根据各个邮箱厂家的协议绑定
  • self.conn = self.connect_mail()
  • self.mailidlist = self.get_mailidlist()
  • def connect_mail(self):
  • conn = imaplib.IMAP4_SSL(host=self.imapserver, port=self.imapport)
  • conn.login(self.emailuser, self.emailpasswd)
  • conn.list() # 列出邮箱中所有的列表,如:收件箱、垃圾箱、草稿箱。。。
  • conn.select('INBOX') # 选择收件箱(默认)
  • return conn
  • def get_mailidlist(self):
  • result, dataid = self.conn.uid('search', None, "ALL")
  • mailidlist = dataid[0].split() # 转成标准列表,获得所有邮件的ID
  • mailidlist.reverse()
  • return mailidlist
  • def get_body(self, msg):
  • try:
  • # 解析邮件内容
  • if msg.is_multipart():
  • return self.get_body(msg.get_payload(0))
  • else:
  • return msg.get_payload(None, decode=True)
  • except:
  • return ''
  • def get_list_message_one(self):
  • # 获取邮箱下所有的发件人和主题
  • latest_message = self.mailidlist
  • # 获取所有的邮件信息
  • for id in latest_message:
  • result, data = self.conn.fetch(id, '(RFC822)') # 通过邮件id获取邮件
  • e = email.message_from_bytes(data[0][1])
  • try:
  • subject = email.header.make_header(email.header.decode_header(e['SUBJECT']))
  • mail_from = email.header.make_header(email.header.decode_header(e['From']))
  • print("邮件的subject -- [%s]" % subject)
  • print("邮件的发件人 -- [%s]" % mail_from)
  • except:
  • pass
  • def get_list_message_two(self):
  • # 根据邮箱发件人读取对应的邮件内容并匹配验证码
  • latest_message = self.mailidlist
  • # 获取所有的邮件信息
  • for id in latest_message:
  • result, data = self.conn.fetch(id, '(RFC822)') # 通过邮件id获取邮件
  • e = email.message_from_bytes(data[0][1])
  • try:
  • subject = email.header.make_header(email.header.decode_header(e['SUBJECT']))
  • mail_from = email.header.make_header(email.header.decode_header(e['From']))
  • print("邮件的subject -- [%s]" % subject)
  • print("邮件的发件人 -- [%s]" % mail_from)
  • if 'book' in str(mail_from):
  • try:
  • body = str(self.get_body(e), encoding='utf-8') # utf-8 gb2312 GB18030解析中文日文英文
  • if 'FB-' in str(body):
  • facebook_code = re.compile(r'FB-(\d{5})', re.S).findall(body)
  • print(f'gmail code: {facebook_code[0]}')
  • # print("邮件内容 -- [%s]" % body)
  • break
  • except:
  • pass
  • except:
  • pass
  • def run(self):
  • try:
  • self.get_list_message_one()
  • self.get_list_message_two()
  • except Exception as error:
  • print(f'error:{error}')
  • finally:
  • self.conn.logout() # 推出邮件连接
  • if __name__ == '__main__':
  • runstart = receive_gmail()
  • runstart.run()
  • get_list_message_one效果图
在这里插入图片描述
  • get_list_message_two效果图
在这里插入图片描述

不管是qq、360、136等各大系列的邮箱,基本上大同小异。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门