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:
-
Noget der kan modtage og sortere posten så mu4e kan finde den (her bruger jeg imap via mbsync)
-
Noget der kan /sende/ posten afsted igen, hvis man gerne vil have den del med (SMTP), så mu4e kan skibe beskederne videre.
-
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.