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

时间:2020-10-16 15:47:38

标签: python gmail-imap imaplib

我正在尝试在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的新手,正在慢慢学习它。请回答我的愚蠢问题 预先感谢

1 个答案:

答案 0 :(得分:0)

我发现了字符串具有特殊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