zemail // CROSS-APP MAIL FEATURE PORT

Capabilities ported from Gmail, Apple Mail, Outlook, ProtonMail, Hey, Spark and Superhuman on top of the Thunderbird base. Status is hand-assessed and grep-audited against the real source.
76 cross-app features · 0 overclaim flag(s) · generated 2026-07-01

Coverage: 100.0%

🟢 full 76 · 🟡 partial 0 · 🔴 missing 0 · weighted 100.0% of 76 tracked features
100.0%weighted coverage
76full
0partial
0missing
0overclaim flags

Every cross-app feature

AppFeatureStatusNote
GmailSnoozeFULLmessage.snooze/unsnooze/snooze.due + reader Snooze (date prompt); the list hides messages snoozed into the future
GmailScheduled send (send later)FULLoutbox.schedule + outbox.due (send_at) + compose "Send later" date picker
GmailUndo sendFULLoutbox queue + cancel + GUI 5s send-hold with an Undo button (reopens the draft on undo)
GmailInbox categories / tabsFULLmessage.categorize (Primary/Social/Promotions/Updates/Forums heuristics) + GUI category tabs
GmailMute conversationFULLthread.mute/unmute/muted + reader Mute button
GmailNudges / follow-up remindersFULLmessage.followup + followup.due + reader Follow-up (date prompt)
RFC 8058One-click unsubscribeFULLList-Unsubscribe captured at import; message.unsubscribe + reader Unsubscribe opens the target
Apple MailVIP sendersFULLvip.add/list/remove + reader VIP button
Outlook / SparkPin messageFULLmessage.pin + reader Pin + pinned messages float to the top of the list
ProtonMailSelf-destruct / message expiryFULLmessage.expire + expire.due auto-deletes when due + reader Expire (date prompt)
ProtonMailEnd-to-end encrypted sendFULLOpenPGP + S/MIME encrypt-on-send via the key store + compose Encrypt toggle
HeyThe Screener (sender approval)FULLscreener.approve/list/remove + screener.pending + GUI Screener panel (approve pending senders, manage approved)
Hey / SparkSet aside / reply laterFULLmessage.set_aside + reader Set-aside button
Superhuman / GmailTemplates / canned responses / snippetsFULLtemplate.add/list/remove + Templates manager modal + compose template picker
Spark / NewtonRead receiptsFULLcompose 'Read receipt' checkbox adds the Disposition-Notification-To header (RFC 8098) on send
Gmail / ThunderbirdVacation / out-of-office auto-responderFULLvacation.get/set/reply — RFC 3834-aware (skips list/auto/self, once per sender, active window + contacts-only) + Settings → Vacation responder modal
GmailAttachment reminder (forgot attachment)FULLcompose.attachment_reminder scans subject+body for attach cues; compose Send confirms when nothing is attached
Thunderbird / OutlookCalendar invites (iCalendar / .ics) + RSVPFULLcalendar.parse_invite + calendar.rsvp (METHOD:REPLY accept/decline/tentative) + reader invite card with Accept/Tentative/Decline opening an RSVP reply to the organizer
Thunderbird / MuttConversation threading via References/In-Reply-To (JWZ algorithm)FULLmessage.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 clientsRFC 2047 encoded-word header encoding (outbound)FULLmime.encode_header UTF-8/Base64 encodes non-ASCII subjects + display names, ≤75-char word splitting on char boundaries (mail-parser only decodes)
RFC 2045Quoted-printable codec (encode + decode)FULLmime.qp_encode/qp_decode with soft line-wrap ≤76 cols and =XX escapes; round-trips
Thunderbirdformat=flowed plain-text wrapping (RFC 3676)FULLmime.flow_encode/flow_decode: soft-wrap on word boundaries with trailing flow-space + space-stuffing; unwrap rejoins
All clientsRFC 5322 / MIME message builder + .eml exportFULLmessage.build_rfc5322 + export.eml serialize a Message to wire bytes (QP body, multipart/alternative + mixed, base64 attachments); re-parses cleanly
Thunderbird ImportExportToolsmbox folder exportFULLexport.mbox writes an mboxrd archive (From_ separators + >From quoting) that round-trips through import.mbox
Thunderbird / GmailAuthentication-Results parsing (SPF/DKIM/DMARC/ARC verdicts)FULLmime.auth_results parses RFC 8601 (authserv-id, per-method result + properties, comment stripping) and summarizes pass/partial/fail
All clientsDKIM-Signature header parsing (RFC 6376)FULLmime.dkim_info extracts v/a/d/s/c/h/t/x/bh tags for the signed-by display
Fastmail / Dovecot PigeonholeSieve (RFC 5228) filter exportFULLfilter.to_sieve compiles zemail filters to a valid Sieve script (allof/anyof, header/body tests, fileinto/setflag/addflag/discard)
eM Client / Outlook / Thunderbird DCMDuplicate contact detectionFULLcontact.find_duplicates clusters contacts sharing a normalized email (Gmail dot/+tag folding) and names a richest-record primary
eM Client / OutlookContact mergeFULLcontact.merge unions emails/phones and back-fills name/org/note into the primary, removing the duplicates
zemail original — beyond Outlook Focused Inbox / Gmail Priority InboxExplainable triage importance scoreFULLmessage.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 snippetsReading-time estimate + preview snippetFULLmessage.reading_time returns word count, seconds at 200 wpm, and a whitespace-collapsed 140-char snippet (HTML-stripped fallback)
Outlook / GmailAttachment safety scan (blocked/executable types)FULLmessage.attachment_safety flags executable extensions (Outlook Level-1 set), macro Office docs, and double-extension disguises
Thunderbird / GmailDMARC policy evaluation from published records (identifier alignment)FULLpolicy.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
GmailSPF record parsing (RFC 7208)FULLpolicy.spf_parse reads v=spf1 mechanisms with qualifiers (+/-/~/?) and the terminal all-policy
Gmail / Google WorkspaceARC chain validation model (RFC 8617)FULLmime.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 unsubscribeFULLlist.parse_headers structures List-Id/Unsubscribe/Post/Archive/Help/Owner, detects List-Unsubscribe-Post one-click, and picks the preferred unsubscribe action
Gmail / SuperhumanSearch operator query language + inverted indexFULLsearch.query compiles from:/to:/subject:/is:/has:/label:/after:/before: + quoted phrases + -negation, narrows via a term index, then verifies each candidate
Superhuman / SparkConversation quote-stripping (new-content extraction)FULLmessage.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 / OutlookiCalendar RRULE expansion (DAILY/WEEKLY/MONTHLY/YEARLY)FULLcalendar.expand_rrule expands FREQ/INTERVAL/COUNT/UNTIL/BYDAY into occurrences via self-contained proleptic-Gregorian date math (no chrono)
Outlook Scheduling Assistant / Google CalendarFree/busy computationFULLcalendar.freebusy merges overlapping busy intervals and returns the free gaps in a window
All clients (RFC 6068)mailto: URI parsing → compose draftFULLcompose.parse_mailto percent-decodes to/cc/bcc/subject/body (multi-recipient, + as space) into a Message compose payload
All clientsHTML-to-text conversionFULLhtml.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 blockFULLhtml.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 / GmailAttachment content sniffing (magic bytes vs declared type)FULLattachment.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 / OutlookPGP/MIME + S/MIME message structure (verify-model)FULLcrypto.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 / ThunderbirdDuplicate message detectionFULLmessage.find_duplicates groups by Message-ID or a From+Subject+Date+length content fingerprint, keeping the first and listing the rest for removal
Thunderbird / MuttConversation stats + list-aware subject normalizationFULLmessage.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 filtersExplainable phishing risk scoreFULLmessage.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 remindersAction-item extraction (questions / deadlines / requests)FULLmessage.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 modelFULLjmap.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-modelFULLimap.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 conversionFULLvcard.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 parsingFULLcalendar.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 mathFULLcalendar.parse_alarms reads ACTION/TRIGGER/DESCRIPTION and parses relative durations (-PT15M/-P1DT2H) into signed trigger minutes
Outlook / Google Calendar (RFC 5545)VTIMEZONE offset handlingFULLcalendar.parse_vtimezone reads TZID + STANDARD/DAYLIGHT rules and normalizes TZOFFSETTO (±HHMM) into signed minutes east of UTC
Outlook (Word mail-merge) / YeswareMessage templates + mail-mergeFULLcompose.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 ClientContact photo via Gravatar (MD5 hash model)FULLcontact.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 punycodeFULLaddress.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 InboxPriority inbox ranking + sectionsFULLmessage.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 / SuperhumanSnooze / send-later scheduling math (quick-picks)FULLschedule.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 actionsFULLsieve.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 / GmailFolder digest / summaryFULLfolder.digest reports total/unread/flagged/attachments/bulk counts, top senders and per-category tallies for a folder
Thunderbird saved searchesMailing-list virtual folders (thread-per-list)FULLlist.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 nagInbox-load / attention-budget estimateFULLfolder.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-upCommitment scan (promises you made)FULLmessage.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) parsingFULLmessage.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) parsingFULLmessage.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 decodeFULLattachment.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 parseFULLimap.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 parseFULLimap.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 compileFULLimap.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 parseFULLimap.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 + sortFULLjmap.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 assemblyFULLmessage.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 / HeyOpen-tracking / spy-pixel detectionFULLmessage.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)FULLcontact.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
Generated by scripts/gen_mailapps_report.sh from scripts/mailapps_features.tsv.