aerc, mbsync, and postfix for maximum comfy offline email May 17, 2021 on Drew DeVault's blog

I am the original author of the aerc mail client, though my official relationship with it today is marginal at best. I think that, with hindsight, I’ve come to understand that the “always online” approach of aerc’s IMAP implementation is less than ideal. The next email client (which will exist at some point!) will improve on this design, but, since it’s still my favorite email client despite these flaws, they will have to be worked around.

To this end, I have updated my personal aerc setup to take advantage of its Maildir support instead of having it use IMAP directly, then delegate IMAP to mbsync. This brings a much-needed level of robustness to the setup, as my Maildirs are available offline or on a flaky connection, and postfix will handle queueing and redelivery of outgoing emails in similar conditions.1 This allows me to read and reply to email entirely offline, and have things sync up automatically when a connection becomes available.

The mbsync configuration format is kind of weird, but it is pretty flexible. My config file ended up looking like this:

IMAPAccount migadu
Host imap.migadu.com
User sir@cmpwn.com
Pass [...]
SSLType IMAPS

MaildirStore local
Path ~/mail/
INBOX ~/mail/INBOX
SubFolders Verbatim

IMAPStore migadu
Account migadu

Channel primary
Far :migadu:
Near :local:
Patterns INBOX Archive Sent Junk
Expunge Both

The password can be configured to run an external command if you prefer to integrate this with your keyring or password manager. I updated my aerc accounts.conf as well, which was straightforward:

[Drew]
source = maildir://~/mail
outgoing = /usr/sbin/sendmail
from = Drew DeVault <sir@cmpwn.com>
copy-to = Sent

Running mbsync primary at this point is enough to fetch these mailboxes from IMAP and populate the local Maildirs, which can then be read with aerc. I set up a simple cronjob to run this every minute to keep it up to date:

* * * * * chronic mbsync primary

chronic is a small utility from moreutils which converts reasonably behaved programs that return a nonzero exit status into the back-asswards behavior cron expects, which is that printing text to stdout means an error occurred and any status code, successful or not, is disregarded. You might want to tweak this further, perhaps by just directing all output into /dev/null instead, if you don’t want failed syncs to fill up your Unix mail spool.

mbsync is bidirectional (it is recommended to leave Expunge both out of your config until you’ve tested the setup), so deleting or archiving emails in aerc will mirror the changes in IMAP as well.

Postfix is a lot more annoying to configure. You should assume that what I did here isn’t going to work for you without additional changes and troubleshooting. I started with an /etc/postfix/sasl_passwd file like this:

[smtp.migadu.com]:465   sir@cmpwn.com:password

The usual postmap /etc/postfix/sasl_passwd applies here to create or update the database file. Then I moved on to main.cf:

# Allows localhost to relay mail
mynetworks = 127.0.0.0/8

# SMTP server to relay mail through
relayhost = [smtp.migadu.com]:465

# Auth options for SMTP relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = lmdb:/etc/postfix/sasl_passwd

# ¯\_(ツ)_/¯
smtp_tls_security_level = encrypt
smtp_tls_wrappermode = yes
smtp_use_tls = yes
smtp_sasl_security_options = 

Good luck!

Updated 2021-05-25: isync is not a fork of mbsync.


  1. Postfix is probably overkill for this, but hey, it’s what I know. ↩︎

Have a comment on one of my posts? Start a discussion in my public inbox by sending an email to ~sircmpwn/public-inbox@lists.sr.ht [mailing list etiquette]

Articles from blogs I read Generated by openring

Summary of changes for November

Hey everyone! This is the list of all the changes we've done to our projects and apps during the month of November. We'll also be reporting in our on position in the world, and on our future plans. Summary Of Changes Donsol, designed a donsol tu…

via Hundred Rabbits December 1, 2021

Announcing chat.sr.ht: a persistent IRC session for sourcehut users

About one month ago, we began a private beta for chat.sr.ht, the next flagship sourcehut product. Starting today, this service is now available to all paid sourcehut users. chat.sr.ht is a hosted IRC bouncer service, which maintains a persistent IRC connectio…

via Blogs on Sourcehut November 29, 2021

Major errors on this blog (and their corrections)

Here's a list of errors on this blog that I think were fairly serious. While what I think of as serious is, of course, subjective, I don't think there's any reasonable way to avoid that because, e.g., I make a huge number of typos, so many tha…

via danluu.com November 22, 2021