in issues/144/user_tool.py [0:0]
def get_magic_link(retries=5, delay=10):
imap = imaplib.IMAP4_SSL("imap.gmail.com")
imap.login(original_email, APP_PASSWORD)
for _ in range(retries):
imap.select("inbox")
status, messages = imap.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 = imap.fetch(latest_email_id, "(RFC822)")
for response_part in msg_data:
if isinstance(response_part, tuple):
msg = email.message_from_bytes(response_part[1])
subject, encoding = decode_header(msg["Subject"])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding or "utf-8")
# Get the email content
if msg.is_multipart():
for part in msg.walk():
content_type = part.get_content_type()
content_disposition = str(part.get("Content-Disposition"))
if "text/plain" in content_type and "attachment" not in content_disposition:
body = part.get_payload(decode=True).decode("utf-8", errors="ignore")
break
else:
body = msg.get_payload(decode=True).decode("utf-8", errors="ignore")
# Extract the magic link
link_match = re.search(r"(https?://[^\s]+)", body)
if link_match:
magic_link = link_match.group(1)
imap.logout()
return magic_link
else:
print("No unread emails found with the subject. Retrying...")
else:
print("Failed to retrieve emails. Retrying...")
time.sleep(delay)
imap.logout()
print("Max retries reached. Email not found.")
return None