尝试从Gmail阅读具有特定主题的电子邮件

问题描述

我正在尝试在Gmail中阅读具有特定主题的电子邮件,并在电子邮件中获取OTP值。我正在使用imaplib

  import imaplib  
  def get_CreateAccount_OTP(self,email_type):
        gmail = imaplib.IMAP4_SSL("imap.gmail.com",993)
        gmail.login(self.gmail_username,self.gmail_password)
        gmail.select('Inbox',readonly=True)

     type,data = gmail.search(None,'(SUBJECT "Here\'s your Texas by Texas email verification.")')

我得到的类型返回为Ok,但是数据如下

 data = {list: 1} [b'']
 0 = {bytes: 0} b''
  __len__ = {int} 1

在该行之后,它不会进入下面的“ for循环”

    for num in data[0].split():
        typ,data = gmail.fetch(num,'(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = str(email.message_from_string(raw_email_string))
    email_message_list = email_message.split('\n')
    RE_TIME_STAMP_PATTERN = re.compile((r'\d{6}'))
    for line in email_message_list:
        print(line)
        if 'Your sign-in verification code is ' in line:
            self.OTP = re.findall(RE_TIME_STAMP_PATTERN,line)[0]
            break
    self.log.info("OTP:",self.OTP)
    return self.OTP
   

注意:我是Python的新手,正在慢慢学习它。请回答我的愚蠢问题 预先感谢

解决方法

我发现了字符串具有特殊char且implib无法将char转换为Unicode的问题。因此,我必须删除字符串中包含特殊字符的单词。

 import imaplib  
  def get_CreateAccount_OTP(self,email_type):
        subject="your Texas by Texas email verification."
        gmail = imaplib.IMAP4_SSL("imap.gmail.com",993)
        gmail.login(self.gmail_username,self.gmail_password)
        gmail.select('Inbox',readonly=True)

     type,data = gmail.search(None,'(UNSEEN SUBJECT "%s")' % subject)
  
    for num in data[0].split():
        typ,data = gmail.fetch(num,'(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = str(email.message_from_string(raw_email_string))
    email_message_list = email_message.split('\n')
    RE_TIME_STAMP_PATTERN = re.compile((r'\d{6}'))
    for line in email_message_list:
        print(line)
        if 'Your sign-in verification code is ' in line:
            self.OTP = re.findall(RE_TIME_STAMP_PATTERN,line)[0]
            break
    self.log.info("OTP:",self.OTP)
    return self.OTP

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...