| Gmail | Snooze | FULL | message.snooze/unsnooze/snooze.due + reader Snooze (date prompt); the list hides messages snoozed into the future |
| Gmail | Scheduled send (send later) | FULL | outbox.schedule + outbox.due (send_at) + compose "Send later" date picker |
| Gmail | Undo send | FULL | outbox queue + cancel + GUI 5s send-hold with an Undo button (reopens the draft on undo) |
| Gmail | Inbox categories / tabs | FULL | message.categorize (Primary/Social/Promotions/Updates/Forums heuristics) + GUI category tabs |
| Gmail | Mute conversation | FULL | thread.mute/unmute/muted + reader Mute button |
| Gmail | Nudges / follow-up reminders | FULL | message.followup + followup.due + reader Follow-up (date prompt) |
| RFC 8058 | One-click unsubscribe | FULL | List-Unsubscribe captured at import; message.unsubscribe + reader Unsubscribe opens the target |
| Apple Mail | VIP senders | FULL | vip.add/list/remove + reader VIP button |
| Outlook / Spark | Pin message | FULL | message.pin + reader Pin + pinned messages float to the top of the list |
| ProtonMail | Self-destruct / message expiry | FULL | message.expire + expire.due auto-deletes when due + reader Expire (date prompt) |
| ProtonMail | End-to-end encrypted send | FULL | OpenPGP + S/MIME encrypt-on-send via the key store + compose Encrypt toggle |
| Hey | The Screener (sender approval) | FULL | screener.approve/list/remove + screener.pending + GUI Screener panel (approve pending senders, manage approved) |
| Hey / Spark | Set aside / reply later | FULL | message.set_aside + reader Set-aside button |
| Superhuman / Gmail | Templates / canned responses / snippets | FULL | template.add/list/remove + Templates manager modal + compose template picker |
| Spark / Newton | Read receipts | FULL | compose 'Read receipt' checkbox adds the Disposition-Notification-To header (RFC 8098) on send |
| Gmail / Thunderbird | Vacation / out-of-office auto-responder | FULL | vacation.get/set/reply — RFC 3834-aware (skips list/auto/self, once per sender, active window + contacts-only) + Settings → Vacation responder modal |
| Gmail | Attachment reminder (forgot attachment) | FULL | compose.attachment_reminder scans subject+body for attach cues; compose Send confirms when nothing is attached |
| Thunderbird / Outlook | Calendar invites (iCalendar / .ics) + RSVP | FULL | calendar.parse_invite + calendar.rsvp (METHOD:REPLY accept/decline/tentative) + reader invite card with Accept/Tentative/Decline opening an RSVP reply to the organizer |
| Thunderbird / Mutt | Conversation threading via References/In-Reply-To (JWZ algorithm) | FULL | message.thread_tree builds the real reply tree from References/In-Reply-To (JWZ containers + subject-group fallback + missing-parent placeholders); complements subject-only message.threads |
| All clients | RFC 2047 encoded-word header encoding (outbound) | FULL | mime.encode_header UTF-8/Base64 encodes non-ASCII subjects + display names, ≤75-char word splitting on char boundaries (mail-parser only decodes) |
| RFC 2045 | Quoted-printable codec (encode + decode) | FULL | mime.qp_encode/qp_decode with soft line-wrap ≤76 cols and =XX escapes; round-trips |
| Thunderbird | format=flowed plain-text wrapping (RFC 3676) | FULL | mime.flow_encode/flow_decode: soft-wrap on word boundaries with trailing flow-space + space-stuffing; unwrap rejoins |
| All clients | RFC 5322 / MIME message builder + .eml export | FULL | message.build_rfc5322 + export.eml serialize a Message to wire bytes (QP body, multipart/alternative + mixed, base64 attachments); re-parses cleanly |
| Thunderbird ImportExportTools | mbox folder export | FULL | export.mbox writes an mboxrd archive (From_ separators + >From quoting) that round-trips through import.mbox |
| Thunderbird / Gmail | Authentication-Results parsing (SPF/DKIM/DMARC/ARC verdicts) | FULL | mime.auth_results parses RFC 8601 (authserv-id, per-method result + properties, comment stripping) and summarizes pass/partial/fail |
| All clients | DKIM-Signature header parsing (RFC 6376) | FULL | mime.dkim_info extracts v/a/d/s/c/h/t/x/bh tags for the signed-by display |
| Fastmail / Dovecot Pigeonhole | Sieve (RFC 5228) filter export | FULL | filter.to_sieve compiles zemail filters to a valid Sieve script (allof/anyof, header/body tests, fileinto/setflag/addflag/discard) |
| eM Client / Outlook / Thunderbird DCM | Duplicate contact detection | FULL | contact.find_duplicates clusters contacts sharing a normalized email (Gmail dot/+tag folding) and names a richest-record primary |
| eM Client / Outlook | Contact merge | FULL | contact.merge unions emails/phones and back-fills name/org/note into the primary, removing the duplicates |
| zemail original — beyond Outlook Focused Inbox / Gmail Priority Inbox | Explainable triage importance score | FULL | message.importance scores [0,100] from VIP/direct-addressing/urgency/reply/no-reply/bulk signals with a per-signal reasons breakdown (transparent, not an opaque server model) |
| zemail original — beyond Superhuman / Spark snippets | Reading-time estimate + preview snippet | FULL | message.reading_time returns word count, seconds at 200 wpm, and a whitespace-collapsed 140-char snippet (HTML-stripped fallback) |
| Outlook / Gmail | Attachment safety scan (blocked/executable types) | FULL | message.attachment_safety flags executable extensions (Outlook Level-1 set), macro Office docs, and double-extension disguises |
| Thunderbird / Gmail | DMARC policy evaluation from published records (identifier alignment) | FULL | policy.dmarc_parse + policy.dmarc_eval parse a v=DMARC1 record and compute SPF/DKIM alignment (relaxed org-domain / strict) → pass + disposition (none/quarantine/reject) with a reason |
| Gmail | SPF record parsing (RFC 7208) | FULL | policy.spf_parse reads v=spf1 mechanisms with qualifiers (+/-/~/?) and the terminal all-policy |
| Gmail / Google Workspace | ARC chain validation model (RFC 8617) | FULL | mime.arc_chain checks Seal/Message-Signature/AAR instance sets are contiguous 1..n with no intermediate cv=fail and reports the sealed chain verdict |
| Gmail / Yahoo (RFC 8058) | List-* header parsing + one-click unsubscribe | FULL | list.parse_headers structures List-Id/Unsubscribe/Post/Archive/Help/Owner, detects List-Unsubscribe-Post one-click, and picks the preferred unsubscribe action |
| Gmail / Superhuman | Search operator query language + inverted index | FULL | search.query compiles from:/to:/subject:/is:/has:/label:/after:/before: + quoted phrases + -negation, narrows via a term index, then verifies each candidate |
| Superhuman / Spark | Conversation quote-stripping (new-content extraction) | FULL | message.strip_quotes removes >-quotes, On-…-wrote attributions (multi-locale), Outlook Original-Message blocks, and the trailing -- signature to isolate the reply's own text |
| Thunderbird Lightning / Outlook | iCalendar RRULE expansion (DAILY/WEEKLY/MONTHLY/YEARLY) | FULL | calendar.expand_rrule expands FREQ/INTERVAL/COUNT/UNTIL/BYDAY into occurrences via self-contained proleptic-Gregorian date math (no chrono) |
| Outlook Scheduling Assistant / Google Calendar | Free/busy computation | FULL | calendar.freebusy merges overlapping busy intervals and returns the free gaps in a window |
| All clients (RFC 6068) | mailto: URI parsing → compose draft | FULL | compose.parse_mailto percent-decodes to/cc/bcc/subject/body (multi-recipient, + as space) into a Message compose payload |
| All clients | HTML-to-text conversion | FULL | html.to_text turns block tags into breaks, li into bullets, decodes entities, drops script/style, collapses whitespace |
| Thunderbird (remote-content blocking) | HTML sanitizer + tracking-pixel/remote-content block | FULL | html.sanitize strips script/style + on* handlers + javascript: URLs and (default) blocks remote src/background, reporting blocked_remote for the load-images banner |
| Outlook protected view / Gmail | Attachment content sniffing (magic bytes vs declared type) | FULL | attachment.sniff identifies PDF/PNG/JPEG/GIF/WEBP/ZIP(OOXML)/gzip/PE/ELF/Mach-O from leading bytes and flags exe-disguised-as-doc mismatches |
| Thunderbird / Outlook | PGP/MIME + S/MIME message structure (verify-model) | FULL | crypto.mime_structure recognizes multipart/signed (PGP + pkcs7), multipart/encrypted, and application/pkcs7-mime, locating the signed part + detached signature before any crypto runs |
| eM Client / Thunderbird | Duplicate message detection | FULL | message.find_duplicates groups by Message-ID or a From+Subject+Date+length content fingerprint, keeping the first and listing the rest for removal |
| Thunderbird / Mutt | Conversation stats + list-aware subject normalization | FULL | message.thread_stats reports participants/unread/flagged/depth/last-date; canonical_subject strips [list] tags + Re/Fwd/AW/SV prefixes |
| zemail original — beyond Outlook / Gmail opaque spam filters | Explainable phishing risk score | FULL | message.phishing_scan sums auth-fail + display-name spoof + brand impersonation + punycode/homoglyph domain + urgency language + link-text/href mismatch into a [0,100] score with a per-signal reasons list |
| zemail original — beyond Superhuman reminders | Action-item extraction (questions / deadlines / requests) | FULL | message.action_items scans sentences for questions, deadline+request cues, and requests, producing a transparent to-do list with no server model |
| Fastmail (JMAP RFC 8620/8621) | JMAP Email/Mailbox object model | FULL | jmap.email_get / jmap.mailbox_get map Message/Folder into JMAP Email + Mailbox objects (keywords, mailboxIds, bodyValues, roles, myRights) wrapped in an RFC 8620 methodResponses envelope |
| Thunderbird activity manager (IMAP RFC 3501) | IMAP command/response parse-model | FULL | imap.parse_command tokenizes tagged commands (UID FETCH folding, quoted mailboxes); imap.parse_fetch reads untagged FETCH data-items (UID/FLAGS/RFC822.SIZE/INTERNALDATE); imap.parse_response reads OK/NO/BAD completions |
| Apple Contacts / Google (RFC 6350) | vCard 3.0 ↔ 4.0 conversion | FULL | vcard.convert + contact.export_vcard4 emit VERSION:4.0 with structured N, TYPE=/PREF params and tel: URI values, and round-trip 4.0→3.0 back to bare numbers; vcard_version detects the declared version |
| Thunderbird Lightning / Apple Reminders / Outlook Tasks (RFC 5545) | iCalendar VTODO / VJOURNAL parsing | FULL | calendar.parse_todos reads UID/SUMMARY/DUE/STATUS/PERCENT-COMPLETE/PRIORITY; calendar.parse_journals reads dated notes |
| Thunderbird Lightning / Outlook (RFC 5545) | iCalendar VALARM reminders + ISO-8601 trigger math | FULL | calendar.parse_alarms reads ACTION/TRIGGER/DESCRIPTION and parses relative durations (-PT15M/-P1DT2H) into signed trigger minutes |
| Outlook / Google Calendar (RFC 5545) | VTIMEZONE offset handling | FULL | calendar.parse_vtimezone reads TZID + STANDARD/DAYLIGHT rules and normalizes TZOFFSETTO (±HHMM) into signed minutes east of UTC |
| Outlook (Word mail-merge) / Yesware | Message templates + mail-merge | FULL | compose.mail_merge renders {{field}} placeholders per recipient row into one Message each (To from email/name), reporting missing fields; template.render + {{{escape}}} for a single body |
| Apple Mail / Spark / eM Client | Contact photo via Gravatar (MD5 hash model) | FULL | contact.gravatar computes the canonical lowercased-trimmed MD5 (self-contained RFC 1321, no md5 crate) and builds the avatar URL with size + default style |
| All clients (RFC 5321 / RFC 5890) | Email address validation + IDN punycode | FULL | address.validate enforces RFC 5321 local/domain rules and A-label-encodes Unicode domains (müller.de → xn--mller-kva.de) via a self-contained RFC 3492 Punycode encoder; address.to_ascii exposes the IDN conversion |
| Gmail Priority Inbox / Outlook Focused Inbox | Priority inbox ranking + sections | FULL | message.priority_rank layers unread/flag/pin/thread/recency signals on the explainable importance score, sorts descending, and splits into important vs everything_else sections |
| Gmail / Spark / Superhuman | Snooze / send-later scheduling math (quick-picks) | FULL | schedule.resolve turns later_today/tonight/tomorrow/this_weekend/next_week/weekday presets and +Nm/+Nh/+Nd offsets into a concrete timestamp via proleptic-Gregorian ordinal math (no chrono) |
| Fastmail / Dovecot Pigeonhole (RFC 5228) | Sieve script parsing + extended actions | FULL | sieve.parse reads require capabilities and fileinto/redirect/keep/discard/stop/setflag/vacation/notify actions (RFC 5230/5232/5435), counts if/elsif rule blocks, and round-trips scripts to_sieve emits |
| Spark Smart Inbox / Gmail | Folder digest / summary | FULL | folder.digest reports total/unread/flagged/attachments/bulk counts, top senders and per-category tallies for a folder |
| Thunderbird saved searches | Mailing-list virtual folders (thread-per-list) | FULL | list.virtual_folders groups List-Unsubscribe-bearing mail by sender into per-list virtual folders sorted by size with unread counts |
| zemail original — beyond Superhuman Inbox Zero nag | Inbox-load / attention-budget estimate | FULL | folder.inbox_load estimates minutes-to-clear from unread reading time + ~90s per reply-needing message (question or direct non-bulk), not just a raw unread count |
| zemail original — beyond Superhuman reminders / Spark follow-up | Commitment scan (promises you made) | FULL | message.commitment_scan finds first-person commitments (I'll send… by Friday) in a message you sent and pairs them with deadline cues — the mirror image of action-item extraction |
| Postfix / all MTAs (RFC 3464) | Delivery-status notification (bounce) parsing | FULL | message.parse_dsn reads message/delivery-status (or the whole multipart/report), extracts Reporting-MTA + per-recipient Final-Recipient/Action/Status/Diagnostic-Code/Remote-MTA and classifies each fate as hard (5.x.x) / soft (4.x.x) / ok, flagging any_hard_bounce |
| Read-receipt clients (RFC 8098) | Disposition-notification (read receipt) parsing | FULL | message.parse_mdn reads message/disposition-notification into Reporting-UA, Original/Final-Recipient, Original-Message-ID and splits Disposition into action-mode / sending-mode / type (displayed/deleted/…) |
| Outlook Rich Text (MS-OXTNEF) | TNEF / winmail.dat decode | FULL | attachment.parse_tnef walks the 0x223E9F78 attribute stream (LVL/attribute/length/data/checksum) and recovers MessageClass, Subject, Body and each encapsulated attachment (title/transport-filename + size) that non-Outlook clients otherwise lose as an opaque winmail.dat |
| Thunderbird activity manager (IMAP RFC 3501) | IMAP ENVELOPE parse | FULL | imap.parse_envelope parses the ENVELOPE S-expression (date/subject + from/sender/reply-to/to/cc/bcc address structures + in-reply-to/message-id) via a NIL-aware quoted/nested tokenizer, combining mailbox@host per address |
| Thunderbird / IMAP MIME (RFC 3501 §7.4.2) | IMAP BODYSTRUCTURE MIME tree parse | FULL | imap.parse_bodystructure recursively parses single vs multipart BODYSTRUCTURE into a MIME tree (media_type/subtype/encoding/size/lines + nested parts) without fetching bodies |
| IMAP clients (RFC 3501 §6.4.4) | IMAP SEARCH criteria compile | FULL | imap.build_search compiles structured criteria (from/to/cc/subject/body/text, SINCE/BEFORE/ON dates, SEEN/FLAGGED/ANSWERED/DELETED tri-states, LARGER/SMALLER, HEADER, UID set) into an AND-combined SEARCH key string with proper quoting, ALL when empty |
| IMAP THREAD ext (RFC 5256) | Server THREAD=REFERENCES response parse | FULL | imap.parse_thread parses the nested (a b (c)(d)) THREAD response into a ThreadNode tree, folding the linear chain so the outermost id parents its replies and sibling branches hang off the branch point |
| Fastmail (JMAP RFC 8621 §4.4) | JMAP Email/query filter + sort | FULL | jmap.email_query evaluates a JMAP FilterCondition/FilterOperator (AND/OR/NOT; inMailbox/from/to/cc/subject/body/text/hasKeyword/minSize/before/after/hasAttachment) over the local store and applies a multi-key sort comparator list (receivedAt/subject/from/size, isAscending), returning ids + an Email/query response |
| Gmail / Apple Mail (RFC 2046 §5.2.1) | message/rfc822 forwarding assembly | FULL | message.forward_assemble builds inline forwards (---------- Forwarded message ---------- attribution + quoted body, as a composable Message) and attached forwards (multipart/mixed with the original encapsulated verbatim as message/rfc822), Fwd:-prefixing without doubling |
| Apple Mail Privacy / ProtonMail / Hey | Open-tracking / spy-pixel detection | FULL | message.tracking_scan flags remote images that are 1×1 (attr or CSS px), CSS-hidden, match a known-tracker host/pattern table (Mailchimp/SendGrid/HubSpot/Yesware/Mailgun/…), or are keyed by an opaque recipient id — with per-tracker reasons + vendor, ignoring cid:/data: locals |
| Apple Contacts / CardDAV (RFC 6350 §6.1.4) | vCard group cards (KIND:group + MEMBER) | FULL | contact.parse_groups reads KIND:group vCards into ContactGroup (uid/name/MEMBER uris), skipping non-group cards; contact.export_group emits a 4.0 group card, mailto:-scheming bare-email members and passing urn:uuid: through |