github maathimself/mailflow v4.1.0
MailFlow v4.1.0

5 hours ago

MailFlow v4.1.0

You can now schedule a message to send later, and this release fixes a long list of reliability problems: a send that could go out twice, a Delete forever that could remove the wrong message, slow first opens of Gmail mail, and new mail that didn't show until a reload. Thanks to @fahadalisarwar1 for requesting scheduled send, to @Monkey7539 for the Delete forever fix, to @salmonumbrella for working through the move handling with us, and to @eldridgea, @faldor20 and everyone else who reported these.

New

  • Send later (#543). Send in the composer now has a menu next to it with Tomorrow morning, Tomorrow afternoon, Monday morning, Later today (6 PM, offered until 4 PM), or any date and time up to a year ahead. Ctrl/Cmd+Shift+Enter opens it. On a phone, use the clock button next to Send. The message is stored encrypted on your MailFlow server and sent from there, so your browser doesn't need to be open. Attachments and forwarded messages are saved when you schedule, so archiving the original doesn't break the send.
  • The Scheduled view. Scheduled messages appear under Scheduled in the sidebar, next to Snoozed. From there you can edit, reschedule, send now or delete them, and restore a deleted one for a few minutes. Messages that need you are listed first, with the reason in words.
  • A scheduled message is sent at most once. If MailFlow can't tell whether the server took the message (for example, the connection dropped mid-send), it never retries on its own. The message shows as "Check delivery" and you decide: send anyway, or mark as sent. Temporary errors are retried for about four hours, a sign-in problem pauses the message until you sign in again, and you get a notification whenever a message needs you.
  • Offline at send time. If your server was down when a message was due, MailFlow sends it once it's back, if it's at most 6 hours late, and marks it "Sent late". Later than that, it pauses the message and asks you, so a "see you in an hour" note never goes out two days late.
  • Editing a scheduled message is safe. A message you have open can't be sent underneath you. If it's open in another window or device, MailFlow asks before moving it to the one you're using. If you close the tab after the send time has passed, the message is paused instead of sent.
  • Same action buttons in conversations (#650). Each message in a conversation now has the same icon buttons, in the same order, as a single open message. That brings the read toggle (a message in a conversation could be marked unread but not read again), View full headers, Todoist, the remote images and unsubscribe notices, and attachments above the message. The menus work from the keyboard, and on a phone the extra tools sit in a More menu.
  • Faster first opens (#677). Resting the mouse on a message loads its body ahead of the click, and bodies are fetched with fewer server round trips. Opening Gmail messages that weren't cached yet is noticeably quicker.

Fixes

  • A normal send could go out twice (#685). When a send failed after the mail server had already accepted the message, MailFlow could retry on another server address and deliver it again. It now switches address only if the first attempt never got as far as starting the message.
  • Delete forever in Trash could remove a different message (#666). MailFlow now checks the message is still the one you chose before removing it.
  • Moves on servers without UIDPLUS (#665). After a move, MailFlow now finds the moved copy by its content instead of guessing, and drops a row it can't match rather than pointing it at another message. Applies to label removal and GTD too.
  • New mail right after adding an account (#682). Mail that arrived during the first sync sometimes didn't all appear until a reload.
  • Mark as unread (#683). After marking a message unread, the right-click menu, the GTD panel and the unread count now agree. A read still in progress can no longer undo a Mark as unread you just made, and opening a conversation no longer counts its first message as read twice.
  • OAuth settings in .env on Docker (#676). GOOGLE_* and MS_* settings in .env were never passed to the backend container. They are now, once you update your compose file (see Upgrading).
  • Microsoft accounts with sending turned off. Microsoft turns off sending from mail apps (SMTP) for some Outlook.com mailboxes, often new ones, and work admins can turn it off too. MailFlow used to call this a sign-in problem, which signing in again can't fix. It now says what happened, and that you can still send from Outlook on the web.
  • Reconnecting after sleep. Returning to the tab no longer reloads the list twice, a connection that stopped answering is replaced, and a resync that fails is retried instead of leaving the list stale.
  • Clicks during background loading. Opening a message no longer waits behind prefetching and other background work on the same account.
  • Smaller fixes: the custom snooze picker used the UTC date, so it offered the wrong day in the evening west of UTC. Mark all read now refreshes the counts after the server has the change. A sent message and its Sent copy now have the same Date header. The close buttons of the headers and spam explanation windows now have labels for screen readers, and notifications are now read out by screen readers. A folder's favorite button showed a raw label instead of its name, and the Favorites labels were English in every language. Undoing a GTD classify after the message changed elsewhere now says so instead of showing a server error.

Security

  • Hardened access checks. Every route now looks up mail, accounts, rules and contacts through one shared ownership check, and a test fails the build if a route adds its own lookup.
  • Stored credentials: a damaged encrypted value is now rejected instead of being partly read.

Upgrading

ghcr.io/maathimself/mailflow-backend:latest points at 4.1.0, published for amd64 and arm64.

  • Download the new compose file (docker-compose.yml or docker-compose.ghcr.yml). It passes your .env OAuth settings to the backend (#676), and it gives the backend 30 seconds to stop, so a send in progress can finish during an update. Settings saved under Settings > Email providers still take precedence over .env.
  • One database migration (0071), applied automatically when the backend starts. It adds the tables for scheduled messages; existing data is unchanged.
  • Downgrading to 4.0.x: 4.0.x doesn't send scheduled messages, so send or delete any pending ones first. 4.0.x also refuses to make backups while the scheduled send tables exist. After switching back, remove them (this deletes every scheduled message):
    docker compose exec postgres psql -U mailflow -d mailflow -c "DROP TABLE scheduled_message_attachments, scheduled_messages; DELETE FROM schema_migrations WHERE version = '0071_scheduled_messages';"
    
    Use your DB_USER and DB_NAME if you changed them. Upgrading to 4.1 again recreates the tables.

MailFlow is built and maintained by one person. If it's useful to you, you can support it on GitHub Sponsors or Ko-fi. Using MailFlow in a business? A business license supports development too. Thank you to everyone who already does.

Don't miss a new mailflow release

NewReleases is sending notifications on new releases.