您当前的位置:首页 > 计算机 > 编程开发 > 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等各大系列的邮箱,基本上大同小异。

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