Skip to content

Reading mail ​

This page covers what Swanmail does with a message once it is open: how the body is shown, what it blocks, and the actions that belong to a single message or conversation.

Conversations ​

Replies are grouped into a conversation by their References / In-Reply-To headers. Opening one shows its latest message expanded, with the earlier messages folded above it; click earlier messages to reveal them, or a folded row to expand it. Each expanded message has its own Reply / Reply All / Forward row and a … menu with View plain text, View raw headers, View source and Save as .eml.

Mark all as read ​

The envelope button with a check mark at the top of the message list marks everything the list shows as read: one folder, or for All Inboxes and Unread, the Inbox of every account. Mail in other folders stays as it is. The same is in a folder's right-click menu in the sidebar, and in the command palette. It is not offered for Starred or a search.

Remote images ​

Remote images are blocked by default. A blocked message shows a banner with Show remote images (this message only), Always allow this sender and Always allow this domain; the two rules are stored per account. Blocking is enforced by the message frame's Content-Security-Policy, so it covers everything a message can use to fetch a picture — <img>, srcset candidates, CSS background images and web fonts — not only the <img src> that is taken out. A blocked image shows as its alt text in a small dashed label, or not at all when it has none, so it takes no room and leaves no empty area to click.

The ⋯ menu above a message also has Show remote images or Hide remote images. It acts on the message you are reading (in a conversation, on all of its messages) until you quit the app. It does not change the setting in Settings → Reading, and it can hide images that a sender or domain rule shows.

When images are allowed, the app's backend prefetches them and hands the message data URLs, so the sender does not see your IP address change between opens and the message does not wait on a slow image host. The prefetcher refuses loopback, link-local and private-network addresses, checks every redirect, and gives up on a batch after 2.5 seconds; whatever is missing is then loaded by the message frame itself.

Swanmail's icon in the menu bar shows the unread count beside it. Clicking it opens a menu with All Inboxes, each account's Inbox in the sidebar's order, Compose Email, Settings… and Quit Swanmail; each brings the window forward. On Windows the icon sits in the notification area: a click opens the window, a right click the menu. An orange dot on the icon means there is unread mail; the count is in its tooltip and on the taskbar button. On Linux the icon goes in the desktop's status area, where the desktop has one.

Dark mode ​

In the dark theme an HTML message is recoloured to match rather than shown as a white page. Each colour it declares is changed according to what it is used for: a light background or border becomes dark, dark text becomes light, and colours already on the dark side are kept. Lightness is flipped in OKLab and hue is kept, so a yellow callout stays yellow and a blue link stays blue. Images are not recoloured, except that one that is mostly transparent with dark content (typically a logo) is inverted so it does not vanish against the dark background.

A message that brings its own dark design is respected, as Apple Mail does: when the sender's rules for prefers-color-scheme: dark give it dark backgrounds, those rules are switched on and nothing else in the message is recoloured. A block that only swaps a logo, restyles a button or darkens a panel on a page that stays white is applied too, but the rest of the message is still adapted. A message whose text already sits mostly on dark backgrounds is left as it is.

After that, text that would still be hard to read is fixed. A sender's own dark design can leave a light box in place, and a link in it would take the dark theme's light link colour. Any text or link with less than 3:1 contrast against what is behind it gets a colour that suits that background. Text in the exact colour of its background was hidden on purpose and stays hidden.

Settings → General → Reading → Messages in dark mode chooses between Adapt (the default) and Original, which shows messages in their own light colours. Show Original Colors / Adapt to Dark Mode in a message's … menu switches one conversation until the app restarts.

Sender verification ​

Next to the sender, Swanmail shows what your own mail server concluded about where the message really came from: Verified sender when DMARC passed (or SPF and DKIM passed for the domain in the From line), Partly verified when only some of that holds, and Unverified sender when DMARC failed or nothing that passed matches the From domain. Click the badge for the SPF, DKIM and DMARC results and the domains they apply to. A message that fails DMARC also gets a line above its body.

Only the results your receiving server added are trusted. A sender can put a forged Authentication-Results header into a message, so Swanmail reads the ones at the top, above the first hop that came from somewhere else, and ignores the rest. When your server added none, no badge is shown — absence is not a verdict.

Every link opens in your system browser. When a link's visible text looks like an address but points to a different host, or the destination is a punycode (xn--) or mixed-script domain, Swanmail marks the link and shows “N links point somewhere other than where they say” above the body. Hover a marked link to see where it really goes. Text counts as an address only when it ends in a real top-level domain, so version numbers and file names such as README.md or src/app.cs are not compared.

Calendar invitations ​

A message carrying a text/calendar part or an .ics attachment shows an Invitation card above the body with the title, time (in your time zone, with the recurrence spelled out), location, organizer and attendees.

  • Accept / Maybe / Decline sends the standard iCalendar reply to the organizer by email and remembers your answer on the card. You can change it later; the organizer receives the new answer.
  • Open in calendar hands the .ics file to your operating system's calendar application.

Swanmail does not keep a calendar of its own. An invitation that names no organizer cannot be answered from the card.

Unsubscribe ​

Mailing-list messages that carry a List-Unsubscribe header show an Unsubscribe button under the subject. After you confirm:

  • A sender that supports one-click unsubscribe (RFC 8058) receives the request directly from Swanmail over HTTPS. Private-network addresses are refused.
  • A mailto: unsubscribe opens the composer prefilled, so you can see and send the message yourself.
  • A plain link opens the sender's unsubscribe page in your browser.

Blocking a sender ​

Block sender, in a message's … menu or the command palette, moves that message to Junk and sends everything that address writes from then on straight to Junk as well. The match is on the exact address. Blocked senders are listed at the top of Settings → Rules, where Unblock lifts the block; a blocked sender's messages also offer Unblock sender in their menu. Blocks are applied before your own rules.

Quick reply ​

At the bottom of a message or conversation, Reply to … opens a small editor: write, press ⌘↩ (Ctrl+↩), and the reply goes out exactly as it would from the Reply button — same quoted original, same From address, same five-second Undo. Reply all appears when there are other recipients, and Open in composer carries what you have written into the full composer when you need formatting or attachments. Nothing is saved to Drafts unless you open the composer.

Read receipts ​

If the sender asked for a read receipt, a banner offers Send receipt and Don't send. Swanmail never sends one on its own, and remembers your answer for that message.

Source and raw headers ​

View raw headers shows the header block as received. View source shows the complete RFC 822 message, and Save as .eml writes it to a file other mail programs can open. In a conversation these live in each message's own … menu; for a single message they are in the toolbar's … menu. Reading the source does not mark a message as read.

Messages downloaded by earlier Swanmail versions were stored without their header block. The first time such a message needs its headers — for the Unsubscribe button, an S/MIME check, or this dialog — Swanmail fetches the headers alone from the server and keeps them.

Signed and encrypted mail ​

See GPG encryption and S/MIME.