diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a230a78 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv/ +__pycache__/ diff --git a/.venv/bin/python b/.venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/.venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.12 b/.venv/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/lib64 b/.venv/lib64 deleted file mode 120000 index 7951405..0000000 --- a/.venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/.venv/pyvenv.cfg b/.venv/pyvenv.cfg deleted file mode 100644 index 95b5cdd..0000000 --- a/.venv/pyvenv.cfg +++ /dev/null @@ -1,5 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.12.3 -executable = /usr/bin/python3.12 -command = /usr/bin/python3 -m venv /home/johan/dev/mail-agent/.venv diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..0f12178 Binary files /dev/null and b/src/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/__pycache__/config.cpython-312.pyc b/src/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000..7ad2a89 Binary files /dev/null and b/src/__pycache__/config.cpython-312.pyc differ diff --git a/src/__pycache__/main.cpython-312.pyc b/src/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000..44111f7 Binary files /dev/null and b/src/__pycache__/main.cpython-312.pyc differ diff --git a/src/__pycache__/models.cpython-312.pyc b/src/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..82d3eff Binary files /dev/null and b/src/__pycache__/models.cpython-312.pyc differ diff --git a/src/api/__pycache__/__init__.cpython-312.pyc b/src/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..0b91115 Binary files /dev/null and b/src/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/api/__pycache__/accounts.cpython-312.pyc b/src/api/__pycache__/accounts.cpython-312.pyc new file mode 100644 index 0000000..6e63a95 Binary files /dev/null and b/src/api/__pycache__/accounts.cpython-312.pyc differ diff --git a/src/api/__pycache__/events.cpython-312.pyc b/src/api/__pycache__/events.cpython-312.pyc new file mode 100644 index 0000000..efa83ef Binary files /dev/null and b/src/api/__pycache__/events.cpython-312.pyc differ diff --git a/src/api/__pycache__/messages.cpython-312.pyc b/src/api/__pycache__/messages.cpython-312.pyc new file mode 100644 index 0000000..c9124dd Binary files /dev/null and b/src/api/__pycache__/messages.cpython-312.pyc differ diff --git a/src/imap/__pycache__/__init__.cpython-312.pyc b/src/imap/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..30b443e Binary files /dev/null and b/src/imap/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/imap/__pycache__/client.cpython-312.pyc b/src/imap/__pycache__/client.cpython-312.pyc new file mode 100644 index 0000000..987e482 Binary files /dev/null and b/src/imap/__pycache__/client.cpython-312.pyc differ diff --git a/src/imap/__pycache__/idle.cpython-312.pyc b/src/imap/__pycache__/idle.cpython-312.pyc new file mode 100644 index 0000000..4d8750a Binary files /dev/null and b/src/imap/__pycache__/idle.cpython-312.pyc differ diff --git a/src/imap/__pycache__/parser.cpython-312.pyc b/src/imap/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000..78c3cfe Binary files /dev/null and b/src/imap/__pycache__/parser.cpython-312.pyc differ diff --git a/src/imap/parser.py b/src/imap/parser.py index b9d6dd6..6da7635 100644 --- a/src/imap/parser.py +++ b/src/imap/parser.py @@ -43,7 +43,20 @@ def parse_address(addr: Any) -> str: if addr is None: return "" - # ENVELOPE address format: (name, route, mailbox, host) + # Handle imapclient's Address named tuple + if hasattr(addr, 'mailbox') and hasattr(addr, 'host'): + name = decode_header_value(addr.name) if addr.name else "" + mailbox = decode_header_value(addr.mailbox) if addr.mailbox else "" + host = decode_header_value(addr.host) if addr.host else "" + + if mailbox and host: + email_addr = f"{mailbox}@{host}" + if name: + return f"{name} <{email_addr}>" + return email_addr + return "" + + # Legacy tuple format: (name, route, mailbox, host) if isinstance(addr, (list, tuple)) and len(addr) >= 4: name = decode_header_value(addr[0]) mailbox = decode_header_value(addr[2]) @@ -74,24 +87,41 @@ def parse_envelope(envelope: Any) -> dict: if envelope is None: return {} - # ENVELOPE format: - # (date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, message-id) result = {} try: - if len(envelope) >= 1: - result["date"] = decode_header_value(envelope[0]) - if len(envelope) >= 2: - result["subject"] = decode_header_value(envelope[1]) - if len(envelope) >= 3: - from_list = parse_address_list(envelope[2]) - result["from"] = from_list[0] if from_list else "" - if len(envelope) >= 6: - result["to"] = parse_address_list(envelope[5]) - if len(envelope) >= 7: - result["cc"] = parse_address_list(envelope[6]) - if len(envelope) >= 10: - result["message_id"] = decode_header_value(envelope[9]) + # Handle imapclient's Envelope named tuple + if hasattr(envelope, 'date'): + # Named tuple format (imapclient) + if envelope.date: + result["date"] = envelope.date # Keep as datetime object + if envelope.subject: + result["subject"] = decode_header_value(envelope.subject) + if envelope.from_: + from_list = parse_address_list(envelope.from_) + result["from"] = from_list[0] if from_list else "" + if envelope.to: + result["to"] = parse_address_list(envelope.to) + if envelope.cc: + result["cc"] = parse_address_list(envelope.cc) + if envelope.message_id: + result["message_id"] = decode_header_value(envelope.message_id) + else: + # Legacy tuple format + # (date, subject, from, sender, reply-to, to, cc, bcc, in-reply-to, message-id) + if len(envelope) >= 1: + result["date"] = decode_header_value(envelope[0]) + if len(envelope) >= 2: + result["subject"] = decode_header_value(envelope[1]) + if len(envelope) >= 3: + from_list = parse_address_list(envelope[2]) + result["from"] = from_list[0] if from_list else "" + if len(envelope) >= 6: + result["to"] = parse_address_list(envelope[5]) + if len(envelope) >= 7: + result["cc"] = parse_address_list(envelope[6]) + if len(envelope) >= 10: + result["message_id"] = decode_header_value(envelope[9]) except Exception as e: logger.warning(f"Error parsing envelope: {e}") @@ -191,11 +221,15 @@ def parse_message(uid: int, folder: str, msg_data: dict) -> Optional[Message]: # Parse date msg_date = None - if date_str := env_data.get("date"): - try: - msg_date = parsedate_to_datetime(date_str) - except Exception: - pass + date_val = env_data.get("date") + if date_val: + if isinstance(date_val, datetime): + msg_date = date_val + else: + try: + msg_date = parsedate_to_datetime(str(date_val)) + except Exception: + pass # Parse body if present body_text = "" diff --git a/src/triage/__pycache__/__init__.cpython-312.pyc b/src/triage/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..d4f7a77 Binary files /dev/null and b/src/triage/__pycache__/__init__.cpython-312.pyc differ diff --git a/src/triage/__pycache__/l1.cpython-312.pyc b/src/triage/__pycache__/l1.cpython-312.pyc new file mode 100644 index 0000000..c2327d9 Binary files /dev/null and b/src/triage/__pycache__/l1.cpython-312.pyc differ diff --git a/src/triage/__pycache__/l2.cpython-312.pyc b/src/triage/__pycache__/l2.cpython-312.pyc new file mode 100644 index 0000000..e6066e6 Binary files /dev/null and b/src/triage/__pycache__/l2.cpython-312.pyc differ diff --git a/src/triage/__pycache__/l3.cpython-312.pyc b/src/triage/__pycache__/l3.cpython-312.pyc new file mode 100644 index 0000000..aba3fd7 Binary files /dev/null and b/src/triage/__pycache__/l3.cpython-312.pyc differ diff --git a/src/triage/__pycache__/pipeline.cpython-312.pyc b/src/triage/__pycache__/pipeline.cpython-312.pyc new file mode 100644 index 0000000..d0ff12f Binary files /dev/null and b/src/triage/__pycache__/pipeline.cpython-312.pyc differ