A Python port of the Invisible Internet Project (I2P)
1"""Email message model and parsing.
2
3Parses RFC 822 email messages for display in the web UI.
4
5Ported from i2p.susi.webmail.Mail.
6"""
7
8from __future__ import annotations
9
10from dataclasses import dataclass, field
11from datetime import datetime
12
13
14@dataclass
15class MailMessage:
16 """An email message."""
17 sender: str
18 recipient: str
19 subject: str
20 body: str
21 date: str = ""
22 message_id: str = ""
23 read: bool = False
24
25
26def parse_email(raw: str) -> MailMessage:
27 """Parse a raw RFC 822 email string into a MailMessage."""
28 headers: dict[str, str] = {}
29 lines = raw.split("\r\n") if "\r\n" in raw else raw.split("\n")
30
31 body_start = 0
32 for i, line in enumerate(lines):
33 if line.strip() == "":
34 body_start = i + 1
35 break
36 if ":" in line:
37 key, value = line.split(":", 1)
38 headers[key.strip().lower()] = value.strip()
39
40 body = "\r\n".join(lines[body_start:]) if "\r\n" in raw else "\n".join(lines[body_start:])
41
42 return MailMessage(
43 sender=headers.get("from", ""),
44 recipient=headers.get("to", ""),
45 subject=headers.get("subject", ""),
46 body=body,
47 date=headers.get("date", ""),
48 message_id=headers.get("message-id", ""),
49 )