E-Mail auf der Kommandozeile

Für meine Mails verwende ich mutt, sie werden von GMail aus auf meinen Laptop synchronisiert, mit notmuch durchsucht und ich habe ein paar kleinere Hilfsfunktionen, die Passwörter verschlüsselt im GNOME-Keyring abspeichern und beim Eingang einer wichtigen neuen Mail eine Benachrichtigung (libnotify) anzeigen. Hier möchte ich erklären, wie ich das gemacht habe. Die Anleitung ist nicht zum Blinden kopieren gedacht, man muss mitdenken und seine Pfade entsprechend anpassen, wenn man etwas übernimmt. Wer damit Schwierigkeiten hat, kann gern in den Kommentaren fragen.

  1. Beschreibung
  2. Voraussetzungen
  3. Offlineimap
  4. mutt
  5. libnotify
  6. Github-Repo

Beschreibung des Setups

In den folgenden Kapiteln erkläre ich, was ich genau nutze und wie ich es eingerichtet habe. Nicht erklärt wird hier, wieso man ausgerechnet mutt verwenden sollte. Das muss man entweder schon wissen oder sich noch woanders schlau machen. Für mich war es hauptsächlich die unkomplizierte Einbindung von PGP und die modulare Art und Weise, wie man E-Mail - Synchronisation, Vim als Texteditor, etc verknüpfen kann.

Für den Abruf der Mails verwende ich offlineimap. Dabei handelt es sich um ein Programm, was einen entfernten IMAP-Server und ein lokales maildir synchronisieren kann. Hier ist Synchronisieren wörtlich gemeint, also nicht nur der Abruf vom Mailserver über POP oder IMAP, wie das fetchmail oder getmail machen würden.

Nachdem ich quasi niemals Mails lösche, die nicht gerade automatische Benachrichtigungen von irgendwas oder Spam sind, hat sich einiges angesammelt und trotz der Ordnerstruktur braucht man natürlich eine gute Suchfunktion. Das leistet für mich notmuch.

Ich beabsichtige, weiter bei GMail zu bleiben und pflege dort weiterhin meine Kontakte. Die sind in mutt mit goobook erreichbar.

Der Abruf der Mails (offlineimap), deren Versand (mutt) und das Adressbuch (goobook) brauchen jeweils Zugang zum GMail-Account. Standardmäßig würde man da dann seine Passwörter lokal irgendwo unverschlüsselt hinlegen, aber gerade beim Mailaccount ist sowas sicherheitstechnisch nicht ratsam. Ich möchte sie also im GNOME-Keyring speichern, wo sie verschlüsselt liegen und bei Bedarf abgerufen werden können. Dafür habe ich mir ein paar kleine Scripte geschrieben.

Wichtige eingehende Mails landen bei mir automatisch in einem eigenen Ordner. Darüber möchte ich mittels eines kleinen Popups benachrichtigt werden. Dafür nutze ich ein weiteres Script, was diesen Ordner überwacht und bei Neuzugang ein Popup anzeigt.

Dann gibt es natürlich noch die Feinheiten der Konfiguration - mit welchen Programmen manche attachments geöffnet werden, etc. Am Ende ist auch ein Link zum github-repo meines ~/.mutt-Ordners.

Voraussetzungen

Für das Setup braucht man die folgenden Programme, deren Paketnamen für Debian/Ubuntu ich hier aufliste. Nutzer anderer Distributionen müssen das eben anpassen:

  1. mutt (ohne sidebar) oder mutt-patched (falls man die Sidebar will) Ich persönlich verwende es mit sidebar, wer allerdings einen tiling window manager nutzt oder aus anderen Gründen kleine Terminals hat, muss bedenken, dass für die Sidebar viel Platz draufgeht und die Ansicht der Mails in mutt auf 80 Zeichen ausgelegt ist, d.h. mit Sidebar bricht alles komisch um.
  2. offlineimap
  3. python-virtualenv (weil ich goobook nicht systemweit am Paketmanagement installieren wollte)
  4. python-keyring (weil die Module für GNOME-Keyring etc nicht im virtualenv funktionieren)
  5. urlview (zum extrahieren von Links in E-Mails)
  6. gnupg (zum Verschlüsseln und signieren von Mails)
  7. notmuch (Suche)
  8. python-notify und python-pyinotify (für die automatische Benachrichtigung beim Eingang neuer Mails)

keyring

Die Anleitung beginnt nicht mit dem Abrufen von Mails sondern mit dem sicheren Speichern der Passwörter. Dafür habe ich ein kleines Script geschrieben, was Passwörter im GNOME-Keyring speichert und daraus wieder abrufen kann. Das verwendete Python-Modul verspricht, auch unter OSX, KDE, evtl sogar Windows usw zu funktionieren, ausprobiert habe ich es allerdings nicht.

kr.py

Das Script habe ich nach /home/florian/.mutt/scripts/kr.py gespeichert. Nachdem es installiert ist, müssen nur noch Benutzername und Passwort hinzugefügt werden:

/home/florian/.mutt/scripts/kr.py add florian@florianheinle.de
Password:

In den Konfigurationsdateien wird an verschiedenen Stellen Bezug auf den Pfad zum Script genommen, wer den also anpasst, sollte das im Hinterkopf behalten.

goobook

Für Goobook gibt es in Debian/Ubuntu leider derzeit keine fertigen Pakete. Statt eines zu machen, habe ich die schnellere Lösung gewählt, es in eine lokale Python-Umgebung zu installieren. Das geht so:

virtualenv --system-site-packages /home/florian/.mutt/scripts/python
source /home/florian/.mutt/scripts/python/bin/activate
pip install goobook

Bei Pip handelt es sich um eine Paketverwaltung für Python-Module. Man könnte das auch mit Root-Rechten und ohne das virtualenv aufrufen, dann hätte man es systemweit installiert, aber auch an der Paketverwaltung der Distribution vorbei.

Goobook muss noch konfiguriert werden:

/home/florian/.mutt/goobookrc:

[DEFAULT]
email: florian@florianheinle.de
passwordeval: /home/florian/.mutt/scripts/kr.py get florian@florianheinle.de

Dann noch

ln -s /home/florian/.mutt/goobookrc /home/florian/.goobookrc

Passwort wurde hier, wie man sieht, ausdrücklich keines abgespeichert! Stattdessen wird bei jedem Aufruf der GNOME-Keyring danach befragt.

Um Goobook aus mutt heraus aufrufen zu können, brauchen wir noch einen kleinen Wrapper, der das virtualenv vor Gebrauch aktiviert:

gb_wrap.sh

In der Datei müssen noch Pfade angepasst werden, danach kommt sie nach /home/florian/.mutt/scripts/gb_wrap.sh

offlineimap

Die Konfiguration von offlineimap ist schon etwas länger:

[general]
accounts = Privat
ui = TTY.TTYUI
fsync = False
pythonfile = /home/florian/.mutt/scripts/kr.py

[Account Privat]
localrepository = PrivatLocal
remoterepository = PrivatRemote
status_backend = sqlite
postsynchook = notmuch new

[Repository PrivatLocal]
type = Maildir
localfolders = /home/florian/.mail/florian-florianheinle.de/
nametrans = lambda folder: {'drafts':'[Gmail]/Entw&APw-rfe',
                            'sent': '[Gmail]/Gesendet',
                            'flagged': '[Gmail]/Markiert',
                            'trash': '[Gmail]/Papierkorb',
                            'archiv': '[Gmail]/Alle Nachrichten',
                            }.get(folder, folder)

[Repository PrivatRemote]
type = Gmail
#type = IMAP
remotehost = imap.googlemail.com
remoteuser = florian@florianheinle.de
remotepasseval = get_password('florian@florianheinle.de')
ssl = yes
maxconnections = 1
realdelete = no
nametrans = lambda folder: {'[Gmail]/Entw&APw-rfe': 'drafts',
                            '[Gmail]/Gesendet': 'sent',
                            '[Gmail]/Markiert': 'flagged',
                            '[Gmail]/Papierkorb': 'trash',
                            '[Gmail]/Alle Nachrichten': 'archiv',
                           }.get(folder, folder)
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

Zur Erklärung einzelner Abschnitte:

accounts = Privat

Man kann mehrere Accounts synchronisieren lassen, die muss man hier mit Kommas getrennt auflisten. Dazu müssen dann später noch Einträge angelegt werden, bei denen die Accounts näher beschrieben werden.

ui = TTY.TTYUI

offlineimap bietet die Möglichkeit, verschiedene Oberflächen zu verwenden. Ich nehme diese hier, damit sieht man immer, was genau getan wird. Andere blenden etwa alles außer Fehler aus, näheres erfährt man dazu in der manpage von offlineimap.

fsync = False

Diese Option beschleunigt den Synchronisationsvorgang bei vielen Mails, zu Lasten der Datensicherheit, falls plötzlich der Strom ausfällt oder sonstige Abstürze passieren.

pythonfile = /home/florian/.mutt/scripts/kr.py

offlineimap kann eine Python-Datei für zusätzliche Funktionen in der Konfiguration einbinden. Hier binden wir den Wrapper um den Keyring ein, damit wir keine Passwörter abspeichern müssen.

[Account Privat]
localrepository = PrivatLocal
remoterepository = PrivatRemote
status_backend = sqlite
#postsynchook = notmuch new

Die Beschreibung unseres Accounts. Wer mehrere möchte, muss mehrere solche Blöcke einfügen. Jeder Account braucht ein lokales Repository und ein entferntes. Die Namen sind frei wählbar, sollten allerdings Rückschlüsse auf den Inhalt zulassen. Standardmäßig speichert offlineimap seine Daten in flache Dateien, das ist allerdings bei vielen Mails nicht besonders schnell. Wir verwenden also sqlite stattdessen. Nachdem eine Synchronisation erfolgreich durchgeführt wurde, wird außerdem noch der Befehl notmuch new ausgeführt, der den Suchindex von notmuch aktualisieren soll. Dazu später mehr, für’s erste kommentieren wir das noch aus.

[Repository PrivatLocal]
type = Maildir

Der erste Mail-Speicher, dieser hier liegt auf dem Laptop. Als Typ wählen wir Maildir, so werden die Mails jeweils in einer eigenen Datei in Verzeichnissen abgelegt, die sich an der Ordnerstruktur bei GMail orientieren.

localfolders = /home/florian/.mail/florian-florianheinle.de/

Hier muss der Pfad natürlich angepasst werden.

nametrans = lambda folder: {'drafts':'[Gmail]/Entw&APw-rfe',
                            'sent': '[Gmail]/Gesendet',
                            'flagged': '[Gmail]/Markiert',
                            'trash': '[Gmail]/Papierkorb',
                            'archiv': '[Gmail]/Alle Nachrichten',
                            }.get(folder, folder)

Sieht komplizierter aus, als es ist. Wer kein GMail verwendet, braucht es auch nicht. Hier werden auf dem Laptop die sonst sehr umständlichen Ordnernamen von GMail ([GMail]/Entwürfe) in bequemere Namen übersetzt, also etwa drafts. Danach werden dann die Ordner auf dem Laptop auch benannt und man kann diese im mutt und seiner Konfiguration einfacher ansprechen.

[Repository PrivatRemote]
type = Gmail
#type = IMAP

Der entfernte Mail-Speicher, also das Konto bei GMail oder auf dem Mailserver. Als Typ habe ich Gmail gewählt, dann macht offlineimap ein paar GMail-spezifische Sachen, um nicht so stark gedrosselt zu werden. Wer kein GMail verwendet, kann hier IMAP sagen.

remotehost = imap.googlemail.com
remoteuser = florian@florianheinle.de

Die Zugangsdaten müssen natürlich wieder angepasst werden.

remotepasseval = get_password('florian@florianheinle.de')

get_password ist eine Funktion aus dem Wrapper kr.py und soll das Passwort aus dem Keyring holen.

ssl = yes

Verschlüsselung ist notwendig. Standard wäre hier wohl TLS, hat bei mir mit GMail aber nicht so gut funktioniert, daher SSL

maxconnections = 1

Wer bei GMail mehr als eine Verbindung gleichzeitig macht, wird gedrosselt. Wer kein GMail verwendet, kann mit mehreren parallel aufgebauten Verbidungen so etwas höhere Synchronisationsgeschwindigkeit erzielen.

realdelete = no

Bei GMail ist Löschen von Mails über IMAP nicht Löschen sondern das entfernen des “Labels” (“Posteingang” ist auch ein Label), die Mails sind also trotzdem noch unter “Alle Nachrichten”. Zum tatsächlichen Löschen von Mails muss man in der Konfiguration von mutt ein Shortcut machen, dazu später mehr.

nametrans = lambda folder: {'[Gmail]/Entw&APw-rfe': 'drafts',
                            '[Gmail]/Gesendet': 'sent',
                            '[Gmail]/Markiert': 'flagged',
                            '[Gmail]/Papierkorb': 'trash',
                            '[Gmail]/Alle Nachrichten': 'archiv',
                           }.get(folder, folder)

Wieder die selbe Übersetzung wie oben, diesmal anders herum.

sslcacertfile = /etc/ssl/certs/ca-certificates.crt

Sonst bekommt man eine Zertifikatswarnung, wenn man offlineimap laufen lässt.

Ich habe die Konfiguration nach /home/florian/.mutt/offineimaprc gespeichert und in#s Heimverzeichnis verlinkt:

ln -s /hom/florian/.mutt/offlineimaprc ~/.offlineimaprc

Danach kann man die erste Synchronisation anwerfen:

offlineimap

Das wird seine Zeit dauern, bei vielen Mails mehrere Stunden. Zu Bedenken ist, dass eine Mail bei Google in mehreren Labels gleichzeitig sein kann, außerdem noch in virtuellen Labels wie “Gesendet”, “Wichtig”, “Markiert” und “Alle Nachrichten”. Der tatsächliche Festplattenverbrauch der Mails und die übertragene Datenmenge sind also um einiges höher als die in GMail angegebene Speicherbelegung.

notmuch

Die Suchfunktion von mutt funktioniert recht einfach, mit der Suche in mehreren Ordnern oder im Fließtext von Mails sollte man aber doch lieber notmuch vertrauen. Dabei handelt es sich um einen Indexer und eine Suchfunktion für die Kommandozeile, der sich dadurch natürlich auch gut inmut integrieren lässt - nach Aufruf über ein Makro wird ein neues maildir versucht, gefüllt mit symbolischen Links zu den Suchergebnissen.

Das Setup ist recht einfach:

notmuch setup

Die notwendigen Daten müssen eingegeben werden, dann wird die Konfigurationsdatei automatisch erstellt. Nach erfolgreicher Konfiguration muss zum ersten Mal der Index erstellt werden:

notmuch new

Der selbe Befehl sollte auch alle Nase lang mal ausgeführt werden, um neue Mails in den Index aufzunehmen und gelöschte daraus zu entfernen. Jetzt kann man auch in der offlineimaprc die Zeile mit dem postsynchook aktivieren - nach jeder Synchronisation wird dann auch automatisch die Suche aktualisiert.

Der Aufruf aus mutt braucht noch einen wrapper:

mutt-notmuch.py (von Honza Pokorny) muss nach /home/florian/.mutt/scripts/mutt-notmuch.py kopiert werden.

mutt

Ab einer gewissen Größe der Konfigurationsdatei empfiehlt es sich, diese in mehrere Dateien aufzuteilen, nach Inhalt sortiert. Ich habe mir daher noch ein Unterverzeichnis angelegt: ~/.mutt/config.d/

Zusammenfassung

Hier werden die Teilkonfigurationen eingebunden. Die Pfade muss man natürlich anpassen. Unter einigen System kann es notwendig sein, die muttrc unter ~/.muttrc zu haben - geht natürlich auch als Symlink.

~/.mutt/muttrc

source /home/florian/.mutt/config.d/general
source /home/florian/.mutt/config.d/account
source /home/florian/.mutt/config.d/gmail
source /home/florian/.mutt/config.d/display
source /home/florian/.mutt/config.d/bindings
source /home/florian/.mutt/config.d/behaviour
source /home/florian/.mutt/config.d/pgp

Allgemein:

~/.mutt/config.d/general

# Maildirs verwenden statt mbox-Dateien
set mbox_type = Maildir
# Hauptverzeichnis der Mails
set folder = ~/.mail
# für lokale Adressen oder Abkürzungen
set alias_file = ~/.mutt/alias
# Zwischenspeicher für Kopfzeilen
set header_cache = ~/.mutt/cache/headers/
# Zwischenspeicher für Nachrichteninhalte
set message_cachedir = ~/.mutt/cache/bodies/
# temporäre Dateien
set tmpdir = ~/.mutt/temp
# keine Trennzeile zwischen Signatur und Text
# Sollte dafür in die Signatur rein! Vor die Signatur eine Zeile mit
# "-- "
set sig_dashes = no
# In diese Datei kommt die Signatur:
set signature = ~/.mutt/sig
# nach einigen Befehlen nicht auf Bestätigung warten
set wait_key = no
# Nur drei Sekunden auf Bestätigungen an anderen Stellen warten
set timeout = 3
# Gelesene Mails nicht anbieten, ins Archiv zu verschieben
unset move
# Mails ohne zu fragen löschen
set delete
# nicht fragen beim Verschieben von Mails
unset confirmappend
# nicht Fragen beim Beenden von mutt
set quit
# mails nicht als "alt" markieren
unset mark_old
# beim Suchen auch mit Umlauten usw klar kommen (dekodiert Header etc)
set thorough_search

Accountspezifische Einstellungen

~/.mutt/config.d/account

Hier muss man natürlich jeweils die eigenen Namen eintragen:

# Mailadresse
set from = "florian@florianheinle.de"
# Name im Absender
set realname = "Florian Heinle"
# SMTP Server
set smtp_url = "smtp://florian@florianheinle.de@smtp.googlemail.com:587/"
# Passwort wird aus dem Keyring geholt, Pfad anpassen!
set smtp_pass = `/home/florian/.mutt/scripts/kr.py get florian@florianheinle.de`
# INBOX festlegen, wird als erstes geöffnet
set spoolfile = "+florian-florianheinle.de/INBOX"
# diese Verzeichnisse werden von mutt auf neue Mails überwacht
# mit sidebar-patch erscheinen sie auch in der Sidebar. 
# Die jeweiligen Ordner muss man natürlich anpassen.
# alle außer der letzten  Zeile brauchen hinten den Backslash
# der Eintrag search zeigt auf die Suchergebnisse von notmuch

mailboxes +florian-florianheinle.de/INBOX \
            +florian-florianheinle.de/Benachrichtigungen \
            +florian-florianheinle.de/IFTTT \
            +search
# Mailarchiv
set mbox = "+florian-florianheinle.de/archiv"
# Entwürfe hier hin speichern
set postponed = "+florian-florianheinle.de/drafts"

Gmail-spezifische Einstellungen

Wer kein GMail verwendet, kann das rauslassen. Die Ordner müssen natürlich angepasst werden.

~/.mutt/config.d/gmail

# Suche im Adressbuch von GMail
set query_command="/home/florian/.mutt/scripts/gb_wrap.sh '%s'"
# mit y Mails archivieren
macro index,pager y "<enter-command>unset trash\n <delete-message>" "Gmail archive message"
# tatsächliches Löschen von Mails ist mit GMail und IMAP wie gesagt etwas komplizierter. Darum konfigurieren wir hier das Verschieben in den Papierkorb.
macro index,pager d "<enter-command>set trash=+florian-florianheinle.de/trash\n <delete-message>" "Gmail delete message"

Anzeige-Einstellungen

~/.mutt/config.d/display

# Aussehen der Sidebar. Funktioniert nur mit mutt-pached
set sidebar_delim   = '  │'
set sidebar_visible = yes
set sidebar_width   = 24 
color sidebar_new color221 color233


# Was für Details über die Mails angezeigt werden sollen
ignore *
unignore from: to: cc: date: subject:
# Und in welcher Reihenfolge
unhdr_order *
hdr_order from: to: cc: date: subject:

# Deutsches Datumsformat
set date_format = "%d.%m.%y"
set locale=de_DE.UTF-8
# wie eine Mail in der Übersicht aussehen soll, siehe man muttrc
set index_format = "[%Z]  %D  %-20.20F  %s"
# Konversationen zusammenfügen
set sort = threads
# neueste Mail oben
set sort_aux = reverse-last-date-received
# Etwas Kontext für die angezeigte Mail
set pager_index_lines = 10 
# Etwas Kontext für die angezeigte Seite der Mail-Übersicht
set pager_context = 3
# nicht automatisch zur nächsten Mail weiterscrollen
set pager_stop
# wie vim das Ende der Mail mit ~ anzeigen
set tilde
# keine Pluszeichen bei Zeilenumbruch
unset markers
# Zitate erkennen
set quote_regexp = "^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"
# zuerst plaintext anzeigen, dann erst html
alternative_order text/plain text/enriched text/html
# falls kein Zeichensatz mitgeschickt wird
set assumed_charset = 'utf-8:iso8859-15'

Tastenbelegungen

Die wichtigsten Details:

  1. R = allen Antworten
  2. Space = Thread einfalten
  3. O = alle mails synchronisieren, o = nur die ausgewählten Mailboxen synchronisieren
  4. C = Mail kopieren, M = Mail verschieben
  5. S = Suche mit notmuch starten
  6. Strg+U öffnet eine Liste der URLs in der Mail zum einfachen Aufrufen
  7. Mit b kann man die Sidebar ein/ausblenden, Mail bouncen geht mit B

Navigation:

  1. die Pfeiltasten Hoch/Runter navigieren die Sidebar, Rechts öffnet den Ordner
  2. wie in vim: gg = nach vorn, G = zum Schluss
  3. j/k scrollt hoch/runter, n und p springt Mails vor/zurück

~/.mutt/config.d/bindings

Die Ordner müssen natürlich wieder angepasst werden.

bind index,pager <down>   sidebar-next
bind index,pager <up>     sidebar-prev
bind index,pager <right>  sidebar-open
bind index gg first-entry
bind index G last-entry

bind index R group-reply
bind index <tab> sync-mailbox
bind index <space> collapse-thread
macro index O "<shell-escape>offlineimap<enter>"
macro index o "<shell-escape>offlineimap -qf INBOX,Benachrichtigungen,IFTTT<enter>"
macro index C "<copy-message>?<toggle-mailboxes>" "copy a message to a mailbox"
macro index M "<save-message>?<toggle-mailboxes>" "move a message to a mailbox"
macro index S "<enter-command>unset wait_key<enter><shell-escape>/home/florian/.mutt/scripts/mutt-notmuch.py ~/.mail  /search<enter><change-folder-readonly>+search<enter>" "search mail (using notmuch)"
macro index b '<enter-command>toggle sidebar_visible<enter><r
macro pager b '<enter-command>toggle sidebar_visible<enter><r
bind index B bounce-message
bind pager k  previous-line
bind pager j  next-line
bind pager n next-undeleted
bind pager p previous-undeleted
bind pager gg top
bind pager G  bottom
bind pager R  group-reply
bind attach <return> view-mailcap
macro pager \Cu "|urlview<enter>" "call urlview to open links"

Verhalten

Verschiedene Einstellungen zu mutts Verhalten

~/.mutt/config.d/behaviour

# öffnet direkt den Editor, Empfänger usw wird dann dort eingetragen
set autoedit
set edit_headers
set fast_reply
# Betreff für Weiterleitungen
set forward_format = "Fwd: %s"
set forward_decode
# Falls jemand Reply-To: setzt, das auch beachten
set reply_to
# Zitieren beim Antworten
set include
# Zitieren  beim Weiterleiten
set forward_quote
# Beim Senden folgende Zeichensätze versuchen
set send_charset = 'us-ascii:iso-8859-15:utf-8' 
# Dieses Mail-Format ist in manchen Mailprogrammen schöner
set text_flowed = yes
# Nicht mitschicken dass/welches mutt verwendet wird
set user_agent = no 
# um einzustellen, welche Programme zum Betrachten von Anhängen verwendet werden
set mailcap_path = /home/florian/.mutt/config.d/mailcap

PGP

PGP muss schon eingerichtet sein und funktionieren!

~/.mutt/config.d/pgp

set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
set pgp_verify_command="gpg --no-verbose --batch --output - --verify %s %f"
set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
set pgp_sign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u   %a? %f"
set pgp_clearsign_command="gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?  -u %a? %f"
set pgp_import_command="gpg --no-verbose --import -v %f"
set pgp_export_command="gpg --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
set pgp_timeout=60
set pgp_good_sign="^gpg: Good signature from"
set crypt_replysign
set crypt_replyencrypt=yes
set crypt_verify_sig=yes

Attachments öffnen

~/.mutt/config.d/mailcap

Mit diesen beiden MIME-Types erschlägt man fast alle Anhänge und lässt sie mit den Standardprogrammen der Desktopumgebung öffnen:

application/*; xdg-open %s
image/*; xdg-open %s

libnotify

Wer automatische Benachrichtigung bei neuen Mails in einem Ordner wünscht, kann das Script verwenden, was ich dazu geschrieben habe:

notif.py Angepasse werden muss dabei natürlich die Zeile mit den zu überwachenden Maildirs:

MAILDIRS = [
    '/home/florian/.mail/florian-florianheinle.de/INBOX/new/',
]

Das Script kann mit ./notif.py aus dem Ordner heraus gestartet werden, in dem es liegt. Beenden kann man es einfach mit kill.

Für jede zu überwachende Mailbox muss eine neue Zeile vor die schließende eckige Klammer gesetzt werden, in Anführungsstrichen natürlich und mit Komma am Ende.

Damit die automatische Benachrichtigung funktioniert, muss man offlineimap natürlich regelmäßig ausführen lassen. Dazu kann man etwa in der offlineimaprc in der [Account]-Sektion noch die Option autorefresh = 5 setzen. Dann beendet sich offlineimap nicht mehr und man sollte es natürlich auch nicht mehr aus mutt heraus aufrufen sondern im eigenen Terminal

Interessante Lektüre

  1. man muttrc für alle Konfigurationseinstellungen (mutt)
  2. /usr/share/docs/offlineimap/examples/offlineimap.conf.gz (offlineimap)
  3. Wikipedia: Maildir zum Format, in dem die Mails auf der Festplatte liegen
  4. Das github-Repo mit meiner Konfiguration