All mail clients suck. This one just sucks less.

Reading time ~7 minutes

Nachdem ich vor Jahren schon mal den Versuch gestartet habe, mutt als Mailclient zu benutzen aber wieder recht schnell aufgegeben habe, hab ich vor ein paar Wochen den zweiten Versuch gestartet.

https://twitter.com/fleazpulli/status/791044192453754880

Mutt ist ein textbasierter Mailclient, welcher von Michael Elkins geschrieben und schon 1995 veröffentlicht wurde. Die letzte stable Version ist 1.7.1 und wurde vor wenigen Wochen released. Der Gedanke sein Emails im Terminal zu lesen wirkt für viele erstmal relativ abschreckend, weil es im Vergleich zu GUI Clients wie beispielsweiße Thunderbird oder Mail.app schon ein deutlich anderes Verhalten erfordert. Die meisten Menschen benutzen E-Mail halt schon seit vielen Jahren und haben sich einen bestimmten Workflow angewöhnt. Vorallem wenn man viele Mails pro Tag verarbeiten sind halt auf einen schnellen Workflow angewiesen. Wer schonmal versucht hat ein neues Tastaturlayout zu lernen weiß was dass bedeutet. Die ersten paar Tage oder Wochen fühlt man sich wie jemand der zum ersten Mal einen Computer benutzt weil einfach alles unglaublich lange dauert.

Ein weiteres Problem von mutt ist mMn die Tatsache, dass es per default einfach komplett unbenutzbar ist. Es ist enorm von Vorteil wenn man jemanden hat der schon ein fertig konfiguriertes mutt hat und einem bei der Einrichtung hilft. An dieser Stelle ein Dank an @andir0815 und @flokli für die Unterstützung beim mutt konfigurieren ;)

Setup

Für alle die auch mal mutt testen wollen beschreib ich hier mal kurz mein komplettes Setup. Wenn irgendwas noch unklar ist, einfach ne Mail schreiben oder auf Twitter anhauen.

Mails runterladen

Da ich meine Mails gerne offline auf meinem Laptop hätte benutze ich mbsync um alle meine Postfächer über IMAP runterzuladen. Die Konfiguration für mbsync liegt in ~/.mbsyncrc und sieht für jedes Postfach in etwa wie folgt aus:

	IMAPAccount privat
	# Address to connect to
	Host mail.rainbownerds.de
	User mail@felixbreidenstein.de
	Pass wow.much.long.many.secure
	SSLType IMAPS
	CertificateFile /etc/ssl/certs/ca-certificates.crt

	IMAPStore privat-remote
	Account privat

	MaildirStore privat-local
	# The trailing "/" is important
	Path ~/.mail/mail@felixbreidenstein.de/
	Inbox ~/.mail/mail@felixbreidenstein.de/INBOX

	Channel privat
	Master :privat-remote:
	Slave :privat-local:
	Patterns *
	# Automatically create missing mailboxes, both locally and on the server
	Create Both
	# Save the synchronization state files in the relevant directory
	SyncState *

Statt das Passwort direkt über Pass in das File zu schreiben kann man übrigens auch PassCmd benutzen und bspw. pass aufrufen. Sollte ich vlt. auch endlich mal umbauen… hust

Wenn man jetzt “mbsync -a” aufruft, synchronisiert das Programm mein privates IMAP Konto in den Ordner ~/.mail/mail@felixbreidenstein.de/.

Damit das alle paar Minuten passiert hab ich über Systemd einen Timer angelegt der das automatisch aufruft. Dafür zuständig sind folgende beiden Dateien.

	~ cat .config/systemd/user/sync-mails.timer
	[Unit]
	Description=sync mails every 2 minutes

	[Timer]
	OnBootSec=5min
	OnUnitActiveSec=2min

	[Install]
	WantedBy=timers.target

	~ cat .config/systemd/user/sync-mails.service
	[Unit]
	Description=sync mails using mbsync, index using notmuch
	Wants=network.target

	[Service]
	Environment="DISPLAY=:0"
	Type=oneshot
	ExecStart=-/usr/bin/mbsync -a
	ExecStart=/usr/bin/notmuch new

Dann noch ein “systemctl –user enable sync-mails.timer” hinterher und schon landen alle 2 Minuten meine neuen Mails auf der Platte.

notmuch

Wie in dem Service File oben zu sehen, rufe ich nach dem Syncen der Mails notmuch auf. Bei notmuch ist der Name programm. Egal wieviele Mails du hast, es sind “not much” Mails in den Augen von notmuch. Es baut einen Volltextindex über alle Mails und wird eigentlich benutzt wenn man Mails taggen und darüber sortieren möchte. Wenn man will kann man beispielsweiße alle Mails komplett nurnoch mit Tags versehen und dann was man früher mit Ordnern gemacht hat, über Suchquerys abbilden. Statt dem Ordner Inbox, hat man dann halt einen Suchquery der alle Mails anzeigt die den Tag “inbox” haben.

Ich bin mit meinen IMAP Ordnern eigentlich relativ zufrieden und benutze daher notmuch nur für die Funktionalität dass ich einen Volltextindex über ALLE meine Mails habe und durch die Querysprache von notmuch super schnell suchen kann. Was mich auch von dem Tagging-System abgehalten hat, war beispielsweiße die Inkompatibilität mit anderen Mailclients. Und z.B. auf meinem Handy hab ich halt kein mutt sondern K9.

Meine Config unter ~/.notmuch-config sieht wie folgt aus:

	[database]
	path=/home/fleaz/.mail/

	[user]
	name=Felix Breidenstein
	primary_email=mail@felixbreidenstein.de

	[new]
	tags=new;
	ignore=.uidvalidity;.mbsyncstate

	[search]
	exclude_tags=deleted;spam;

	[maildir]
	synchronize_flags=true

	[crypto]
	gpg_path=gpg

neomutt

Nachdem die Mails nun endlich auf der Platte sind, können wir endlich mit dem eigentlich Mailclient anfangen * zündet Tischkonfetti * Damit das jetzt nicht komplett ausartet versuch ich nur ein paar spezielle Stellen meiner Config zu zeigen. Wer mehr will, bekommt gerne die ganze.

Wichtig ist dass man “neomutt” und nicht “mutt” nimmt. Im laufe der Zeit ist mutt immer mehr durch Patches erweitert worden, weswegen sich irgendwann neomutt gebildet hat, was einfach der mutt Sourcecode direkt mit allen wichtigen Patches ist die man so haben will. Sehr praktisch.

Hier ein paar spannende Stellen der eigentlichen ~/.muttrc

	mailboxes "+======= Privat ======="
	source '~/.mutt/list_boxes.sh mail@felixbreidenstein.de|'

	# GPG
	source '~/.mutt/gpgrc'
	
	set editor="nvim -c  'set ft=mail' -c Goyo -c Limelight!"

	set sidebar_width = 24
	set sidebar_folder_indent
	set sidebar_visible
	set sidebar_short_path
	set sidebar_indent_string = ' '
	set sidebar_format = '%B%*  %n'

	bind index,pager \eX vfolder-from-query
	set nm_query_type = threads

	# configure initial account
	source ~/.mutt/accounts/privat
	set spoolfile=+$my_account/INBOX
	set postponed=+$my_account/Drafts
	set record=+$my_account/Sent
	set my_current_folder='INBOX'

	folder-hook /felix.breidenstein@firma.de/* 'source ~/.mutt/accounts/firma'

Einer der Patches der in neomutt mit drin ist erweitert mutt um eine Sidebar in der die IMAP Ordner angezeigt werden. Damit man die Liste nicht per Hand pflegen muss gibt es das Skript list_boxes.sh was ein find auf mein Maildir macht und dann die Liste der Mailboxes füllt. Die Configzeilen für die Sidebar sind in den Zeilen 20-24. Die Datei aus Zeile 5 findet sich im Sourceordner von mutt und kümmert sich um ein paar sinnvolle Optionen wenn man Mails mit GPG verschlüsseln und Signieren möchte. Die Zeilen 16 und 17 kümmern sich um die Volltextsuche die ich über notmuch machen kann. Mit Alt+Strg+X kann ich die Suche starten und in sekundenbruchteilen durch viele tausend Mails suchen. Zeile 17 sorgt dafür dass wenn ich über die Suche eine Mail finde, mutt mir direkt den kompletten Thread anzeigt zudem die Mail gehört. Dit is praktisch! In Zeile 20 lade ich das Configfile für meinen privaten Mailaccount. Darin befindet sich die Config für den SMTP Server und dort wird beispielsweiße auch die Variable $my_account gesetzt. Durch die Hooks in Zeile 26, die automatisch ausgeführt werden, sobald ich in einen Ordner wechsle der zu einer anderen Identität gehört, wird das jeweilige “accounts/*” File geladen und die $my_account Variable neu gesetzt. Damit kann ich den Rest meiner Config und bspw. sowas wie Keybindings sehr generisch bauen und sie für alle Accounts benutzen. Sehr praktisch!

Hier Beispielsweiße mal die account Config für meinen privaten Mailaccount:

set my_account='mail@felixbreidenstein.de'
set from='mail@felixbreidenstein.de'
set my_name='Felix Breidenstein'
set smtp_url = "smtp://mail@felixbreidenstein.de@mail.rainbownerds.de:587/"
set smtp_pass = 'wow.much.password.many.secure!'

set pgp_use_gpg_agent = yes
set pgp_sign_as = DB8BA5CAB155E65235E3ACBD4CC943CA7E892417
set pgp_timeout = 3600
set crypt_autosign = yes
set crypt_replyencrypt = yes

source '~/.mutt/accounts/common'

Und die ‘common’ Datei:

save-hook . +$my_account/Archives/.%(%Y) 

# Spam
macro index \CS ":set confirmappend=no delete=yes\ns=$my_account/Spam\n<sync-mailbox>:set confirmappend=yes delete=ask-yes\n"

# Archive
macro index \CA ":set confirmappend=no delete=yes\n<save-message>\n<sync-mailbox>:set confirmappend=yes delete=ask-yes\n"

Die beiden Macros in der ‘common’ definieren mir die Shortcuts Strg+A und Strg+S um Mails direkt ohne Nachfrage in den jeweiligen “Archive” oder “Spam” Ordner zu schieben. Vermutlich könnte man noch mehr in die common auslagern, um die account Dateien aufzuräumen.

vim

Die Zeile 7 in meiner .muttrc sagt meinem mutt dass ich meine Mails gerne mit vim schreiben würde. (Oh, über mein vim müsste ich auch mal bloggen…) Die Optionen hinten dran setzen den Datetyp auf E-Mail (ft=mail) was für schönes Syntax Hochlichting wichtig ist. Die beiden “-c” Optionen laden die Plugins Goyo und Limelight. Goyo ist sowas wie der “Distraction Free Mode” den einige evtl. aus großen IDEs, wie bspw Sublime, kennen. Der Text wird zentriert in die Mitte geschoben und alle anderen Elemente des Editors werden ausgeblendet. LimeLight sorgt dafür, dass immer nur der Absatz gehighlightet wird in dem sich der Cursor gerade befindet. Alle anderen werden abgedunkelt. Also beides einfach nur bisschen EyeCandy und nicht wirklich funktionalität. Aber das muss ja auch mal sein. Das Auge codet ja schließlich mit!

Kleiner Offtopic Abstecher:

Um Goyo und Limelight auch im normalen vim zu benutzen hab ich folgendes in meiner vim Config stehen:

map <F11> :Goyo <bar> :Limelight!! <CR>