Skip to content

EmailParser

email_profile.clients.imap.parser.EmailParser

Parses RFC822 content (string or bytes).

Source code in email_profile/clients/imap/parser.py
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
class EmailParser:
    """Parses RFC822 content (string or bytes)."""

    __slots__ = ("_msg",)

    def __init__(self, content: bytes | str) -> None:
        if isinstance(content, bytes):
            self._msg = message_from_bytes(content)
        else:
            self._msg = message_from_string(content)

    def message_id(self) -> Optional[str]:
        return self._msg.get("Message-ID")

    def message_id_or_hash(self, raw: bytes | str) -> str:
        mid = self.message_id()
        if mid:
            return mid
        data = raw if isinstance(raw, bytes) else raw.encode("utf-8")
        return sha256(data).hexdigest()

    def date(self) -> Optional[datetime]:
        raw_date = self._msg.get("Date")
        if not raw_date:
            return None
        try:
            return parsedate_to_datetime(raw_date)
        except (TypeError, ValueError):
            return None

    def subject(self) -> Optional[str]:
        return self._msg.get("Subject")

    def from_(self) -> Optional[str]:
        value = self._msg.get("From", "")
        return parseaddr(value)[1] or None

    def to(self) -> Optional[str]:
        value = self._msg.get("To", "")
        return parseaddr(value)[1] or None

    def header(self, name: str) -> Optional[str]:
        return self._msg.get(name)

__slots__ = ('_msg',) class-attribute instance-attribute

__init__(content)

Source code in email_profile/clients/imap/parser.py
185
186
187
188
189
def __init__(self, content: bytes | str) -> None:
    if isinstance(content, bytes):
        self._msg = message_from_bytes(content)
    else:
        self._msg = message_from_string(content)

date()

Source code in email_profile/clients/imap/parser.py
201
202
203
204
205
206
207
208
def date(self) -> Optional[datetime]:
    raw_date = self._msg.get("Date")
    if not raw_date:
        return None
    try:
        return parsedate_to_datetime(raw_date)
    except (TypeError, ValueError):
        return None

from_()

Source code in email_profile/clients/imap/parser.py
213
214
215
def from_(self) -> Optional[str]:
    value = self._msg.get("From", "")
    return parseaddr(value)[1] or None

header(name)

Source code in email_profile/clients/imap/parser.py
221
222
def header(self, name: str) -> Optional[str]:
    return self._msg.get(name)

message_id()

Source code in email_profile/clients/imap/parser.py
191
192
def message_id(self) -> Optional[str]:
    return self._msg.get("Message-ID")

message_id_or_hash(raw)

Source code in email_profile/clients/imap/parser.py
194
195
196
197
198
199
def message_id_or_hash(self, raw: bytes | str) -> str:
    mid = self.message_id()
    if mid:
        return mid
    data = raw if isinstance(raw, bytes) else raw.encode("utf-8")
    return sha256(data).hexdigest()

subject()

Source code in email_profile/clients/imap/parser.py
210
211
def subject(self) -> Optional[str]:
    return self._msg.get("Subject")

to()

Source code in email_profile/clients/imap/parser.py
217
218
219
def to(self) -> Optional[str]:
    value = self._msg.get("To", "")
    return parseaddr(value)[1] or None