Hvordan jeg fik Mu4e sat op til emails i Emacs

April 28, 2025

Jeg har drømt om at bruge Emacs som mit mailprogram i lang tid, men det var først for nyligt det lykkedes for mig at få det til. Der vrimler ikke lige frem med guides til opsætning med protonmails bridge-klient.

Heldigvis fandt jeg frem til et par guides, som har hjulpet mig enormt.

Dels https://doubleloop.net/2019/09/06/emacs-mu4e-mbsync-and-protonmail/ og dels https://www.tomica.net/blog/2020/12/sending-mail-using-multiple-mu4e-contexts-in-emacs/

Som jeg søgte mod efter at have været en tur forbi https://systemcrafters.net/emacs-mail/managing-multiple-accounts/ og rode med det hele.

Tre komponenter

I første omgang var det, der tog mig aller mest tid for mig, at forstå (DOH!), at når man bruger Emacs som sin mailklient, skal man bruge tre komponenter:

  1. Noget der kan modtage og sortere posten så mu4e kan finde den (her bruger jeg imap via mbsync)

  2. Noget der kan /sende/ posten afsted igen, hvis man gerne vil have den del med (SMTP), så mu4e kan skibe beskederne videre.

  3. mu4e til at administrere begge disse funktioner fra inde i emacs.

IMAP opsætning med mbsync

For nu at tage tingene i den rette orden, skulle jeg først installere mbsync, hvorefter jeg kunne oprette en isynrc-fil i min .config/ mappe og tilføje disse specs:

IMAPAccount protonmail
Host 127.0.0.1
Port 1143
User [DIN E-MAIL @protonmail HER]
Pass [DIN KODE FRA BROEN VIA KRYPTERET FIL HERTIL]
TLSTYPE STARTTLS
CertificateFile ~/.cert/protonmail.crt

IMAPStore remote
Account protonmail

# Man kan selv bestemme hvad maildir skal være, min er .Maildir
MaildirStore local
Subfolders Verbatim
Path ~/.Maildir/ProtonMails/
Inbox ~/.Maildir/ProtonMails/Inbox/

Channel inbox
Far :remote:
Near :local:
Patterns * [ProtonMails]* "[ProtonMails]/Sent Mail" "[ProtonMails]Starred" "[ProtonMails]/Trash"
Create Near
#Expunge Both
SyncState *

For at bruge en sikker mbsync-forbindelse skal du lægge det certifikat, som du får genereret af openssl s_client -starttls imap -connect 127.0.0.1:1143 -showcerts i ~/.cert/protonmail.crt og så henvise til det i din isyncrc (som jeg har gjort herover):

TLSType STARTTLS
TLSVersions TLSv1.2
CertificateFile ~/.cert/protonmail.crt

Du skal bruge linjerne mellem (både første og sidste ‘—-’ inklusiv: —–BEGIN CERTIFICATE—– og —–END CERTIFICATE—–

Så kunne jeg langt om længe åbne en terminal og køre:

mbsync protonmail

og

mu index

For at få mailsynkroniseringen sat op og indexeret på en måde som mu4e kan bruge.

MSMTP til at sende med

Da jeg begyndte at drømme om at kunne sende fra andre adresser end den givne *@protonmail, f.eks. min mail fra fsfe, fandt jeg ud af, at msmtp var nødvendig i min smtp opsætning. Det var heldigvis ret nemt at få det sat op.

Det krævede ikke andet end oprettelse og konfiguration af /usr/bin/msmtp via oprettelse af en .msmtprc-fil som jeg udfyldte jf. en vejledning fra archwiki https://wiki.archlinux.org/title/Msmtp (Jeg bruger debian btw):

~/.msmtprc

# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# Gmail (i mit tilfælde protonmail)
account        gmail
host           smtp.gmail.com
port           465
tls_starttls   off
from           username@gmail.com
user           username
password       plain-text-password

# A freemail service (i mit tilfælde en anden)
account        freemail
host           smtp.freemail.example
from           joe_smith@freemail.example
...

# Accounts can inherit info from another account
account        postmasterfreemail : freemail
from           postmaster*@freemail.example

# Set a default account
account default: gmail (igen for mig en anden værdi her)

og så kunne jeg tilføje dette til min .init fil i Emacs:

;; send med MSMTP
(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)

mu4e opsætningen i .init eller .emacs

Den del tog mig også lidt tid, for jeg skulle først have lokaliseret hvor h*?%&! min mu4e var havnet efter installationen.

Jeg spurgte lidt rundt på nettet efter det, og bl.a. i matrix-gruppen #Emacs:matrix.org hvor det venlige fællesskab der er rundt om den fantastiske editor endnu en gang havde min ryg. - Fik jeg nævnt at jeg ELSKER emacs?!

I første omgang førte det til en basisopsætning, jeg var OK tilfreds med:

  ;;========= E-POST MED mu4e ================
;; setting mu4e to executable path & require
(add-to-list 'load-path "/usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14")
(setq mu4e-mu-binary "/usr/bin/mu")
(require 'mu4e)

;; SMTP from https://doubleloop.net/2019/09/06/emacs-mu4e-mbsync-and-protonmail/
(setq mu4e-maildir "~/mail"
    mu4e-attachment-dir "~/downloads"
    mu4e-sent-folder "/Sent"
    mu4e-drafts-folder "/Drafts"
    mu4e-trash-folder "/Trash"
    mu4e-refile-folder "/Archive")

(setq user-mail-address "DIN_EMAIL_ADRESSE"
    user-full-name  "DIT_FULDE_NAVN")

;; Get mail
(setq mu4e-get-mail-command "mbsync protonmail"
    mu4e-change-filenames-when-moving t   ; needed for mbsync
    mu4e-update-interval 120)             ; update every 2 minutes

;; Send mail with SMTP
(setq message-send-mail-function 'smtpmail-send-it
      smtpmail-auth-credentials "~/.authinfo.gpg" 
      smtpmail-smtp-server "127.0.0.1"
      smtpmail-smtp-service 1025)

Flere konti

Men så var det jeg faldt i kaninhullet. For hvad nu hvis man kunne have flere konti. Derfor ser mail-sektionen af min .init nu ud som følger:

;; Opsætning af mu4e til kontekster med .Mail som hoved-dir:
(setq mu4e-change-filenames-when-moving t) ;; nødvendig for at undgå mbsync issues
;; genopfriskelses-interval
(setq mu4e-update-interval 120)
(setq mu4e-get-mail-command "mbsync -a")
(setq mu4e-maildir "~/.Maildir")

;; Kontekster
(setq mu4e-contexts
      (list
       ;;ProtonMail-konto
       (make-mu4e-context
	:name "protonmail-classic"
	:match-func
	 (lambda (msg)
	   (when msg
	     (string-prefix-p "/ProtonMails" (mu4e-message-field msg :maildir))))
	 :vars '((user-mail-address . "fritjofarnfred@protonmail.com")
		 (user-full-name . "Øjvind Fritjof Arnfred")
		 (user-full-name . "Øjvind Fritjof Arnfred")
                 (mu4e-compose-signature . (concat
					     "Venlig hilsenKind regards\n"
                                             "Øjvind Fritjof Arnfred\n"
					     "+45 29 65 28 52\n"
                                             "https://www.fritjofarnfred.dk"))
		 (mu4e-drafts-folder . "/ProtonMails/[ProtonMails]/Drafts")
		 (mu4e-sent-folder . "/ProtonMails/[ProtonMails]/Sent Mail")
		 (mu4e-trash-folder . "/ProtonMails/[ProtonMails]/Trash")))
;; Personal account
         (make-mu4e-context
          :name "FSFE-konto"
          :match-func
            (lambda (msg)
              (when msg
                (string-prefix-p "/fsfeMails" (mu4e-message-field msg :maildir))))
          :vars '((user-mail-address . "slartibartfast@fsfe.org")
		  (user-full-name . "Øjvind Fritjof Arnfred")
                  (mu4e-compose-signature . (concat
					     "Kind regards\n"
                                             "Øjvind Fritjof Arnfred\n"
					     "+45 29 65 28 52\n"
                                             "https://www.fritjofarnfred.dk"))
		 (mu4e-drafts-folder . "/ProtonMails/[ProtonMails]/Drafts")
		 (mu4e-sent-folder . "/ProtonMails/[ProtonMails]/Sent Mail")
		 (mu4e-refile-folder . "/ProtonMails/[ProtonMails]/All Mail")
		 (mu4e-trash-folder . "/ProtonMails/[ProtonMails]/Trash")))))
       
(setq mu4e-maildir-shortcuts
      '(("/ProtonMails/Inbox" . ?i)
	("/ProtonMails/[ProtonMails]/Sent Mail" . ?s)
	("/ProtonMails/[ProtonMails]/Trash" . ?t)
	("/ProtonMails/[ProtonMails]/Drafts"    . ?d)
        ("/ProtonMails/[ProtonMails]/All Mail"  . ?a)))

Desværre bøvler jeg stadig lidt med den sidste hurdle, som er at kunne /besvare/ mails fra min @fsfe-konto. Jeg tilføjer nok et opslag, når jeg får knækket dèn nød.