mailsuite
A Python package for retrieving, parsing, and sending emails.
Features
Simplified IMAP client (
mailsuite.imap.IMAPClient) — usable on its own, and the engine behind the mailbox abstraction’s IMAP backendAutomatic reconnection and retries after dropped connections and timeouts
Watch a folder for new messages with
IDLEcallbacks, including periodic session refreshUsername/password or OAuth2 (XOAUTH2 / OAUTHBEARER) login
Always uses
/as the folder hierarchy separator, converting to the server’s separator and prepending its namespace automatically, and stripping folder-name characters that collide with the separatorWorks around server quirks across Gmail, Microsoft 365, Exchange, Dovecot, and DavMail, including:
Gmail / Google Workspace returning an empty
IDLEresponseRandom Microsoft 365 / Exchange
BAD/ “unexpected response” errorsNonstandard hierarchy separators and namespaces
Provider-agnostic mailbox abstraction (
mailsuite.mailbox)Single
MailboxConnectioninterface for IMAP, Microsoft Graph, Gmail, and on-disk MaildirFetch message identifiers from any folder, retrieve their raw RFC 822 content, and move or delete messages
Folder management across every backend — create, rename, move, merge, delete, and existence checks, with consistent
FolderExistsError/FolderNotFoundErrorsemanticsWatch a folder for new messages — the IMAP
IDLEcommand on the IMAP backend, polling on the cloud backendsUnified
send_message()on backends that support sending (Microsoft Graph, Gmail) — IMAP and Maildir users send throughmailsuite.smtp.send_email
Consistent email parsing (
mailsuite.utils)Parse RFC 822 messages from a string, bytes, or file path into consistent dictionaries, with HTML bodies also converted to Markdown
SHA256 hashes of attachments
Parsed
Authentication-ResultsandDKIM-SignatureheadersEmail address parsing into display name, local part, domain, and second-level domain, tolerating noncompliant addresses
Check whether a message passed DKIM or DMARC as a trusted domain (
from_trusted_domain)Forward and reverse DNS lookup helpers
Parse Microsoft Outlook
.msgfiles usingmsgconvert
Simplified email creation and sending (
mailsuite.smtp)Easily add attachments, plain text, and HTML
Optional DKIM signing of outgoing mail
Uses opportunistic encryption (
STARTTLS) with SMTP by defaultUsername/password or OAuth2 (XOAUTH2 / OAUTHBEARER) login
DKIM signing and verification (
mailsuite.dkim)Generate RSA keypairs and the matching DNS TXT record
Sign outbound mail with a sensible default header set
Verify one or many
DKIM-Signatureheaders on a received message
ARC (Authenticated Received Chain) sealing and verification (
mailsuite.arc)Seal forwarded mail with an ARC set, extending an existing chain
Verify the ARC chain on a received message and read its
cvresult
Installation
Base install (IMAP, SMTP, DKIM, Maildir, parsing):
pip install mailsuite
If you would like to be able to parse Microsoft Outlook .msg files, install
msgconvert. On Debian-based Linux distributions, msgconvert can be installed
via sudo apt-get install libemail-outlook-message-perl. Other systems can use
cpan -i Email::Outlook::Message.
The Microsoft Graph and Gmail backends are optional extras — the cloud SDKs aren’t pulled in unless you ask for them:
pip install "mailsuite[msgraph]" # Microsoft Graph (msgraph-sdk + azure-identity)
pip install "mailsuite[gmail]" # Gmail (google-api-python-client + google-auth-oauthlib)
pip install "mailsuite[all]" # both
Importing mailsuite.mailbox never requires the extras. Referencing
MSGraphConnection or GmailConnection without the matching extra
installed raises an ImportError pointing at the right install command.
Microsoft Graph notes
MSGraphConnection defaults to the worldwide cloud
(https://graph.microsoft.com). To target a sovereign cloud or any
other Graph endpoint, pass graph_url:
MSGraphConnection(..., graph_url="https://graph.microsoft.us")
The azure-identity token cache lives under name="mailsuite" by
default. Applications migrating from a previous installation that used a
different cache name can pass it through token_cache_name= so existing
cached AuthenticationRecords and tokens continue to work — for
example, token_cache_name="parsedmarc" keeps users authenticated
across the migration.
Microsoft Graph permissions
Grant the appropriate Microsoft Graph API permissions on the app
registration based on which MSGraphConnection operations you need.
Combine permissions across rows when you need multiple capabilities —
e.g., to both read and send mail in a delegated flow against your own
mailbox, grant Mail.ReadWrite and Mail.Send.
Use case |
Delegated (own mailbox) |
Delegated (shared mailbox) |
App-only |
|---|---|---|---|
Read messages only ( |
|
|
|
Read + modify (mark read, delete, move, create folder) |
|
|
|
Send mail ( |
|
|
|
Delegated flows (DeviceCode, UsernamePassword) targeting a shared
mailbox — i.e. when the mailbox argument differs from username —
use the .Shared variants. App-only flows (ClientAssertion, ClientSecret,
Certificate) do not need the .Shared variants since application
permissions span every mailbox in the tenant (unless restricted by an
Application Access Policy).
For delegated flows, MSGraphConnection requests Mail.ReadWrite (or
Mail.ReadWrite.Shared) at authenticate time, so even read-only
callers must consent to at least Mail.ReadWrite. App-only flows
authenticate with https://graph.microsoft.com/.default, which grants
whichever permissions the app registration has consented.
Email samples and Outlook clients
Microsoft Outlook for Windows
If you save an email to a file using Microsoft Outlook on Windows, it will
save the file in a proprietary Microsoft OLE format with a .msg extension.
There are tools like msgconvert that make an attempt to convert a .msg
file to a standard RFC 822 .eml file, and mailsuite will attempt to use
this tool when encountering a .msg file if it is installed on the system.
However, anomalies are introduced during conversion that make the results
unsuitable for forensic analysis.
Instead of using msgconvert, use one of these other Outlook clients.
Note
If a .msg file is attached to an email and sent from a Windows Outlook
client, the email will actually be sent as a .eml file. So, users can send
email samples without needing to worry about the file format.
Microsoft Outlook for macOS
Drag the email from the inbox or other folder and drop it on the desktop. Attached emails can be saved to a file like any other attachment.
Outlook Web Access (OWA)
Create a new email and leave it open a separate window.
Drag the email from the inbox or other folder and drop it in the message of the draft.
Download the attachment that was created in step 2
Emails that are already attached to an email can be downloaded from OWA like any other attachment.