Parcourir la source

fix: read full IMAP body for verification codes

AI-Co-Authored-By: Codex
chendeben il y a 3 mois
Parent
commit
1de099b67a
2 fichiers modifiés avec 52 ajouts et 2 suppressions
  1. 4 2
      scripts/hotmail_helper.py
  2. 48 0
      tests/hotmail_helper_test.py

+ 4 - 2
scripts/hotmail_helper.py

@@ -502,6 +502,7 @@ def normalize_message(message_id, raw_bytes, mailbox):
         },
         "toRecipients": recipient_items,
         "recipientAddresses": recipient_addresses,
+        "bodyText": body,
         "bodyPreview": body[:500],
         "receivedDateTime": to_iso_string(timestamp_ms),
         "receivedTimestamp": timestamp_ms,
@@ -859,17 +860,18 @@ def select_latest_code(messages, sender_filters, subject_filters, exclude_codes,
         sender = str(message.get("from", {}).get("emailAddress", {}).get("address", "")).lower()
         subject = str(message.get("subject", ""))
         preview = str(message.get("bodyPreview", ""))
+        body_text = str(message.get("bodyText", ""))
         recipient_addresses = [
             str(item or "").strip().lower()
             for item in message.get("recipientAddresses", [])
             if str(item or "").strip()
         ]
         recipient_text = " ".join(recipient_addresses)
-        combined = " ".join([sender, subject.lower(), preview.lower(), recipient_text])
+        combined = " ".join([sender, subject.lower(), preview.lower(), body_text.lower(), recipient_text])
         if normalized_target_email and recipient_addresses and normalized_target_email not in recipient_addresses:
             return None
 
-        code = extract_code(" ".join([subject, preview, sender]))
+        code = extract_code(" ".join([subject, preview, body_text, sender]))
         if not code or code in excluded:
             return None
 

+ 48 - 0
tests/hotmail_helper_test.py

@@ -0,0 +1,48 @@
+import importlib.util
+import pathlib
+import unittest
+from email.message import EmailMessage
+
+
+def load_hotmail_helper_module():
+    module_path = pathlib.Path(__file__).resolve().parents[1] / "scripts" / "hotmail_helper.py"
+    spec = importlib.util.spec_from_file_location("hotmail_helper", module_path)
+    module = importlib.util.module_from_spec(spec)
+    assert spec.loader is not None
+    spec.loader.exec_module(module)
+    return module
+
+
+hotmail_helper = load_hotmail_helper_module()
+
+
+class HotmailHelperMessageSelectionTest(unittest.TestCase):
+    def test_select_latest_code_reads_code_from_full_body_when_preview_is_truncated(self):
+        filler = "A" * 800
+        verification_code = "731091"
+
+        message = EmailMessage()
+        message["Subject"] = "Your temporary ChatGPT login code"
+        message["From"] = "noreply@tm.openai.com"
+        message["To"] = "n20260420225606@a4sky.com"
+        message["Date"] = "Tue, 21 Apr 2026 08:49:15 +0800"
+        message.set_content(
+            f"Your temporary ChatGPT login code\n{filler}\nEnter this temporary code to continue: {verification_code}\n"
+        )
+
+        normalized = hotmail_helper.normalize_message("1343", message.as_bytes(), "INBOX")
+        selected = hotmail_helper.select_latest_code(
+            [normalized],
+            ["openai", "noreply", "chatgpt"],
+            ["verify", "verification", "code", "login"],
+            [],
+            0,
+            "n20260420225606@a4sky.com",
+        )
+
+        self.assertEqual(selected["code"], verification_code)
+        self.assertEqual(selected["message"]["id"], "1343")
+
+
+if __name__ == "__main__":
+    unittest.main()