My current email client of choice is Mu4e within Emacs. There’s plethora of reasons why I have settled for it instead of some other client and why in the end, I transitioned to it from
mutt, but that’s perhaps a topic for some future article.
Setting up Mu4e in the beginning was pretty simple as I had only one email account and used asynchronous email function to queue emails and then flush them all in one go. Whole asynchronous process relied on using
Unfortunately, I had to ditch the whole process of queuing email and sending it asynchronously due to the fact that I had to configure multiple accounts in Mu4e.
Setting up email account with context is pretty straight-forward. For simplicity sake here’s an example with single account context, to add one more, you’d basically only copy/paste
,(make-mu4e-context part N times
(setq mu4e-contexts `(,(make-mu4e-context :name "Private" :match-func (lambda (msg) (when msg (string-prefix-p "/Private" (mu4e-message-field msg :maildir)))) :vars '( (user-full-name . "Ivan Tomica") (user-mail-address . "MYEMAIL") (mu4e-compose-signature . (concat "Ivan Tomica\n" "https://www.tomica.net\n")) (mu4e-sent-folder . "/Sent") (mu4e-drafts-folder . "/Drafts") (mu4e-trash-folder . "/Trash") (mu4e-refile-folder . "/Archive") (mu4e-maildir-shortcuts . (("/INBOX" . ?i) ("/Archive" . ?a) ("/Sent" . ?s) ("/Trash" . ?t) ("/Junk" . ?j)))))))
That’s basically enough for reading, searching and managing messages locally.
The problem starts with sending email.
If you’re familiar with mu4e you know it is just an interface for
mu, meaning it has no sending capabilities, instead, you’re using
smtpmail-send-it function which is configured with following variables
(setq smtpmail-smtp-server "MAILSERVERADDRESS" smtpmail-stream-type 'starttls smtpmail-smtp-service 587)
But as you can see, there’s no way to switch those easily depending on which account you use for sending email.
My first instinct was to just configure those within the mu4e context, but unfortunately, for some weird reason, that didn’t work. Setting up variables works just fine, but when you try to send the message, smtpmail-send-it function fails with no clear explanation why. My attempts to debug it were, unsuccessful to say the least…
So, after two days of banging my head against the wall and trying multiple approaches and hacks I finally decided to transition to msmtp. Configuring Emacs was easy as
(setq sendmail-program "/usr/bin/msmtp" message-sendmail-f-is-evil t message-sendmail-extra-arguments '("--read-envelope-from") send-mail-function 'smtpmail-send-it message-send-mail-function 'message-send-mail-with-sendmail)
And configuring .msmtprc was even simpler
defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-bundle.crt logfile ~/.cache/msmtp.log # Private account MYACCOUNT host MYSERVER port 587 from MYEMAIL user MYEMAIL passwordeval "secret-tool lookup MYEMAIL password" account default : MYACCOUNT
And there’s also native way to use GNOME Keyring, so instead of using
passwordeval command as I do, you could use something similar to what is mentioned in Arch Wiki
secret-tool store --label=msmtp host smtp.your.domain service smtp user yourusername
passwordeval options all together.