Vin
Vin

Reputation: 177

Trying to read emails with specific subject from Gmail

I am trying to read an email in Gmail that has a specific subject and get the OTP value within the email. I am using 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.")')

I got the type returned as Ok, but the data as below

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

After that line, it's not going into the below "for loop"

    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
   

Note: I am new to Python and learning it slowly. Please bare with my silly questions Thanks in advance

Upvotes: 0

Views: 2122

Answers (1)

Vin
Vin

Reputation: 177

I found the issue that the string has special char and the implib is not converting the char to Unicode. So I have to remove the word that has the special char in my string.

 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

Upvotes: 1

Related Questions