in issues/285/user_tool.py [0:0]
def check_for_otp(self, recipient: str = None, retries=5, delay=5):
"""
Check for OTP in the Gmail inbox.
"""
try:
mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login(self.original_email, self.password)
for _ in range(retries):
mail.select("inbox")
status, messages = mail.search(None, '(UNSEEN SUBJECT "Expensify magic sign-in code:")')
if status == "OK":
email_ids = messages[0].split()
if email_ids:
latest_email_id = email_ids[-1]
status, msg_data = mail.fetch(latest_email_id, "(RFC822)")
for response_part in msg_data:
if isinstance(response_part, tuple):
msg = email.message_from_bytes(response_part[1])
if recipient and msg["To"] != recipient:
continue
otp_code = self._extract_otp_from_email(msg)
if otp_code:
mail.store(latest_email_id, "+FLAGS", "\\Deleted")
mail.expunge()
mail.close()
mail.logout()
return otp_code
mail.close()
mail.logout()
print("Max retries reached. No OTP found.")
return None
except imaplib.IMAP4.error as e:
print(f"Failed to connect to Gmail: {e}")
return None