wall < "Ein Hoch auf mutt!"

Broadcast message from spillerm@unixe.de (pts/1) (Do Jan 26 22:12:04 2012):
4
Diesen Beitrag schrieb ich vor 7 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

Da ist man mal für ein bisschen Mutterschutzzeit und ein bisschen Elternzeit nicht in der Firma, und schon ist es passiert: die Mailbox läuft langsam aber sicher über: Mails von Verteilern und Mailinglisten, Nagios, munin und cron-apt, und blitzschnell sind da über 4000 ungelesene Nachrichten und die bange Frage: wie soll ich die eigentlich je abarbeiten? Alle markieren und in einen Unterordner verschieben wäre eine Option, aber wie stelle ich sicher, dass mir nichts wichtiges durch die Lappen geht?

Und so habe ich, nach einigen Jahren Abstinenz, mutt exhumiert und installiert; das Teil ist recht mächtig, mächtiger, als manch einer denken mag, und so erzähle ich Euch heute mal ein wenig, was man damit alles machen kann. Natürlich erhebt der Beitrag keinen Anspruch auf Vollständigkeit — er soll vielmehr inspirieren, sich selbst mit der Sache zu beschäftigen. Und los geht’s…

Installation von mutt

  • Mac OS X: port install urlview mutt-devel +compress +date_conditional +deepif +gdbm +gpgme +headercache +idn +sidebar +smtp +ssl +trash +sasl
  • Linux: apt-get install mutt urlview

Generelle Konfiguration von mutt: .muttrc

Generell liegt die Konfiguration als File mit Namen .muttrc im HOME des Users — alternativ kann man mit dem Flag -F aber auch angeben, welche Konfiguration mutt verwenden soll. Ich fange mit ganz grundlegenden Konfigurationen an: ich definiere meinen echten Namen, meine Mailadresse und gebe an, welches Signatur-File zu verwenden ist. In alternates definiere ich, welche sonstigen Mailadressen meine sind — wir werden beim Thema Scoring noch sehen, wie nützlich das ist ;-) Der zu verwendende Editor ist mit Sicherheit Geschmackssache, in meinem Fall soll es vim sein. Zu bedenken: nicht nur, dass man dem vim hier schon Parameter mitgeben kann (im Beispiell spelllang), natürlich wird auch die .vimrc beim Aufruf ausgewertet — das eröffnet sehr umfangreiche Möglichkeiten! Alle 60 Sekunden soll auf auf neue Nachrichten in der Box hin überprüft werden, pager– und index-Format sind sicherlich Geschmackssache.
Wichtig in meinem Beispiel: die generelle Sortierreihenfolge ist "threads" und, in Relation dazu, "score".

set realname="Local Wurst"
set from="localwurst@arbeit.de"
set use_envelope_from="yes"
set envelope_from_address="localwurst@arbeit.de"
set signature="~/.mutt/sig-arbeit"
alternates "@private-domain.de|\
localwurst@andere-arbeitsadresse.de|\
root@arbeit.de"
set timeout="15"
set mail_check="60"
set editor="vim -c \"set spell spelllang=de,en\""
set markers="no"
set sort="threads"
set sort_aux="score"
set index_format="%4C %2N %Z %{%b %d} %-20.20F %s"
set pager_format="(P1) %S [%C/%T] %n (%l) %s"

Mailempfang: mutt und IMAP

Hier definiere ich alles, was den IMAP-Zugriff betrifft: Username und Passwort, INBOX, Trash- und Drafts-Ordner. Die einzelnen Punkte sind in sich selbsterklärend. Ich habe mich bei den Ordnern an dem orientiert, was mein Smartphone beim Zugriff auf die Mailbox veranstaltet, so dass alle — Smartphone, Rechner, Laptop — die selben Ordner verwenden.

set imap_authenticators="LOGIN"
set imap_keepalive="60"
set imap_user="localwurst" ## defaults to user name
set imap_pass="einpasswort"
set folder="imaps://localwurst@mail.arbeit.de:993"
set spoolfile="imaps://localwurst@mail.arbeit.de:993/INBOX"    ## die INBOX
set trash="imaps://localwurst@mail.arbeit.de:993/INBOX/Trash"    ## der Mülleimer
set postponed="imaps://localwurst@mail.arbeit.de:993/INBOX/Drafts"    ## Entwürfe
set record="imaps://localwurst@mail.arbeit.de:993/INBOX/Sent Messages"    ## gesendete Nachrichten

Mailversand: mutt und SMTP

Mails wollen auch verschickt werden — ich entscheide mich für den Mailserver von arbeit.de. Alternativ kann man natürlich auch über einen eigenen Mailserver gehen (nullmailer beispielsweise auf dem gleichen Host), aber mir ist es so lieber:

set smtp_url="smtp://localwurst@mail.arbeit.de:465/"
set smtp_pass="einpasswort"

mutt für Organisierte: ein Alias-File

Im Alias-File wird quasi das Adressbuch verwaltet, und zwar in der Form alias $KURZNAME $VOLLER_NAME <$MAILADRESSE>. Der angegebene Ordner muss vorhanden sein (mkdir ~/.mutt), und das angegebene File muss existieren (touch ~/.mutt/aliases). Im laufenden Betrieb kann man dann die benötigten Adressen sehr bequem auswählen. So kann man aus einer Mail heraus mittels Tastendruck a einen Namen hinzufügen; beim Verfassen einer neuen Mail erhält man mit Tab eine Liste aller Einträge im Alias-File; alternativ kann man auch die ersten Zeichen des Kurznamens angeben, gefolgt von Tab.

set alias_file="~/.mutt/aliases"
set sort_alias="alias"
set reverse_alias="yes"
source $alias_file

Zur Beschleunigung von mutt: Files

Das Caching kann die Verarbeitungsgeschwindigkeit deutlich erhöhen, nähere Informationen hierzu gibt die manpage; in meiner Konfiguration habe ich header_cache und message_cachedir eingerichtet wie folgt:

set header_cache="~/.mutt/cache/headers"
set message_cachedir="~/.mutt/cache/bodies"
set certificate_file="~/.mutt/certs/cacert.txt"

mutt fürs Auge: Farben

Farben sind natürlich Geschmackssache: hier muss jeder für sich entscheiden, wie er’s denn gerne hätte. Deshalb ist meine nachfolgende Konfiguration auch maximal als Anregung zu verstehen, was alles farblich belegt werden kann ;-)

color   attachment      brightmagenta   default
color   error           brightred       default
color   hdrdefault      cyan            default
color   indicator       brightyellow    red
color   markers         brightcyan      default
color   message         brightcyan      default
color   normal          default         default
color   quoted          brightblue      default
color   search          default         green
color   signature       green           default
color   status          black           cyan
color   tilde           magenta         default
color   tree            magenta         default

mutt mit Köpfchen: Headers

Man kann sich prima selbst definieren, welche Header man automatisch bei jeder Mail angezeigt haben möchte; hier ein (recht selbsterklärendes) Beispiel:

ignore *
unignore from: date subject to cc
unignore x-mailing-list: posted-to:
unignore x-mailer
unignore x-spam-level:
hdr_order Date From To Cc Subject X-Mailer X-Spam-Level

mutt für Faule: Macros

Macros sind eine feine Sache: hier kann ich mir selbst definieren, was bei welchem Tastendruck geschehen soll. Die Möglichkeiten sind nahezu unbegrenzt…

bind editor <space> noop
macro index gi "<change-folder>=INBOX<enter>" "Go to INBOX"
macro index gs "<change-folder>=INBOX/Sent Messages<enter>" "Go to sent messages"
macro index gd "<change-folder>=INBOX/Drafts<enter>" "Go to drafts"
macro index sp "<change-folder>=INBOX/SPAM<enter>" "Go to spam box"
macro index \cb |urlview\n    ## <STRG>b zeigt alle in der Nachricht auftauchenden URLs
macro pager \cb |urlview\n
 
macro index <F11> <tag-pattern>"~n -9"<enter><tag-prefix><save-message>"=INBOX/Trash"<enter>$ \
      "Alle Nachrichten mit Score 9 werden bei Druck auf <F11> in den Trash verschoben."
macro index <ESC>r ":source ~/.muttrc\n" \
        "Mit <ESC>r die Konfigurationsdatei neu einlesen"
macro pager <ESC>i "<save-message>=INBOX<enter>\n" \
        "Nachricht in die INBOX verschieben."
macro pager <ESC>a "<save-message>=INBOX/Archiv<enter>\n" \
        "Nachricht ins aktuelle Archiv stopfen."

mutt und Key bindings

Über key bindings kann ich festlegen, was beim Drücken einer bestimmten Taste geschehen soll; hier wurde zum Beispiel das Hütchen ^ mit der Aufgabe betraut, neue Mails vom Server abzurufen (wenn einem das Intervall von 60 Sekunden nicht ausreicht):

bind index "^" imap-fetch-mail

mutt für die Ablage: save-hooks

Mit save-hooks kann man sich die Ablage von Mails erleichtern; gibt man s an zum Speichern einer Nachricht, so fragt mutt, wohin er die Nachricht speichern soll; der Default-Wert entspricht dem ersten Teil der Absender-Mailadresse. Wurde die Nachricht also von chef@arbeit.de gesendet, will mutt sie in den Ordner =chef stecken (den es nicht gibt). Entweder gibt man an dieser Stelle manuell den korrekten Ordner an (=INBOX/Arbeit/Chef), oder man wählt den Ordner mit c aus der Liste der Ordner aus — was praktikabel sein mag, wenn es ein- oder zweimal vorkommt. Für jene Absender jedoch, von denen ich regelmässig Mails erhalte, lege ich mir das Ganze lieber als save-hook ab und muss so nur noch auf ENTER hauen, was erheblich Zeit spart ;-)

## Anhand von Empfaengeradressen
save-hook '~t localwurst@arbeit.de'     =INBOX/Arbeit
 
## Anhand von Absenderadressen
save-hook chef@arbeit.de         =INBOX/Arbeit/Chef

mutt für Organisierte: Scoring

Mit dem Scoring schliesslich kommen Farbe und Ordnung ins Spiel: hier definiere ich mir selbst die Wichtigkeit der eingehenden Nachrichten. So sind beispielsweise die Mails vom Chef am höchsten priorisiert (Ehrensache!), und alle Nachrichten, die an mich adressiert sind (also an meine Mailadressen, definiert in alternates!) haben direkt schonmal Score 10 (im Gegensatz zu, beispielsweise, Spam, Verteilermails, Mailinglisten). Alle Mailinglisten, auf denen ich eingetragen bin, werden mit Score 3 angezeigt, und alle, die LDAP im Subject haben, kriegen Score 2.
Darüberhinaus wechseln Nachrichten, die älter als 14 Tage sind, auf nervige Art die Farbe (weiss/rot) — so werde ich daran erinnert, diese entweder endlich mal zu bearbeiten oder aber, falls bereits geschehen, ordentlich abzulegen. Gelöschte Mails lasse ich schwarz werden, was die Lesbarkeit der Mailbox während der Bearbeitung erhöht (da mein Terminal ebenfalls schwarz ist).
Scores addieren sich! So wird eine Mail, die von chef@arbeit.de an localwurst@arbeit.de gerichtet ist, zum einen den Score 45 erhalten (weil sie vom Chef kommt), und zum anderen den Score 10 (weil sie an mich gerichtet ist), in Summe also 55; würde der Chef im Subject auch noch „LDAP“ verwenden, käme der Score von 2 noch hinzu, also 57. Das muss man bedenken, wenn man die Farbwerte definiert — sonst wundert man sich, weshalb die definierten Werte nicht greifen ;-) Und daher habe ich mir per index_format auch definiert, dass die Score-Werte mit angezeigt werden in der Übersicht (set index_format="%4C %2N %Z %{%b %d} %-20.20F %s").

unscore *
 
## Alle, die konkret an mich gerichtet sind, kriegen schonmal score 10
score '~p' 10
 
## Pruefe gegen Absender Chef - Score 45
score '~f chef@arbeit\.de' 45
 
## all known mailing lists
score '~l' 3
 
## Nachrichten mit 'LDAP' im Subject
score '~s LDAP' 2
 
color index brightmagenta default '~n 51-'
color index brightred default '~n 41-50'
color index brightgreen default '~n 31-40'
color index brightyellow default '~n 21-30'
color index brightred default '~n 11-20'
color index brightblue default '~n 10'
color index brightcyan black '~n 8'
color index magenta default '~n 9'
color index brightblack default '~n 0-5'
 
## Alte Nachrichten aendern ebenfalls die Farbe...
color index white red '~d>14d'
## Geloeschte Nachrichten werden schwarz auf schwarzem Hintergrund...
color index black black "~D"
## Geflaggte Nachrichten werden grellrot
color index brightred black "~F"
 
## Pruefe auf GPG-signierte Nachrichten
## score "~g" 1
##
## Pruefe auf GPG-verschluesselte Nachrichten
## score "~G" 1
##
## Old unread messages
## score "~O" 1
##
## Messages FROM me
## score "~P" 1
##
## Messages I replied to (via mutt)
## score "~Q" 1
##
## Read messages
## score "~R" 1
##
## Messages less than 80.000 bytes
## score "~z 0-80000" 1

mutt und die Definition von Mailinglisten

Beim Scoring wird mit score "~l" 3 definiert, dass die bekannten Mailinglisten den Score 3 erhalten; definiert werden die Mailinglisten beispielsweise in einem File mailinglists. Das muss in die .muttrc eingebunden werden (source ~/.mutt/mailinglists). Alternativ — und wenn die Liste nicht zu lang ist — kann es natürlich auch direkt in die .muttrc geschrieben werden. Die Mailinglisten-Konfiguration sieht ungefähr so aus:

## Known mailinglists
lists devel@arbeit.de
 
## All subscribed mailinglists are automatically known
subscribe admin@arbeit.de
subscribe mitarbeiter@arbeit.de

Darüberhinaus: .vimrc

In der .vimrc kann man ebenfalls noch einige Stunts anschliessen, die einem das Leben etwas einfacher machen: so zum Beispiel Kürzel für häufig verwendete Fragmente einrichten.

set number    # Zeilennumerierung
set tw=72    # Zeilenumbruch nach 72 Zeichen
set ignorecase    # Gross-/ Kleinschreibung bei der Suche ignorieren
set spelllang=de,en spell    # Rechtschreibprüfung deutsch/ englisch
syntax on    # Syntax-Highlighting anschalten
:hi     mailHeader      ctermfg=Grey
:hi     mailSubject     ctermfg=Green
:hi     mailEmail       ctermfg=Blue
:hi     mailSignature   ctermfg=Grey
:hi     mailQuoted1     ctermfg=DarkYellow
:hi     mailQuoted2     ctermfg=Green
:ab     hi              Hallo
:ab     mfg             Viele liebe Grüsse,&lt;CR&gt;localwurst

Darüberhinaus: .mailcap

image/tiff; eog %s
image/jpeg; eog %s
image/jpg; eog %s
image/JPG; eog %s
image/png; eog %s
image/bmp; eog %s
image/gif; eog %s
image/ico; eog %s
application/pdf; acroread %s
application/octet-stream; acroread %s
application/msword; oowriter %s
application/msexcel; oowriter %s
text/richtext; oowriter %s
4
  1. Super Tutorial, vielen Dank! Auf all die Konfigurationsmöglichkeiten wäre ich wohl in vielen Jahren nicht gekommen.

  2. Da hatte ich nun das Problem: der Spell-Checker zeigte mir zwar brav an, wenn etwas – seiner Meinung nach – falsch geschrieben war, jedoch in lindgrün auf hellrosa – grossartiger Kontrast und so gut zu lesen :-O

    Die .vimrc kann angepasst werden, so dass das anders dargestellt wird:

    highlight clear SpellBad
    highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline
    highlight clear SpellCap highlight SpellCap term=underline cterm=underline
    highlight clear SpellRare highlight SpellRare term=underline cterm=underline
    highlight clear SpellLocal highlight SpellLocal term=underline cterm=underline

    Das benutzte spell-File ist auf meinem Mac ~/.vim/spell/de.utf-8.add — nützlich hierzu sind noch folgende Kommentare:

    “ zg to add word to word list
    “ zw to reverse
    “ zug to remove word from word list
    “ z= to get list of possibilities

  3. jedesmal wenn ich diesen titel seh, lese ich „ein hoch auf MUTTI“…. ;D

  4. Hab mal den Mac auch damit versorgt, ich Dösel ging von den Automatismen der FreeBSD Ports aus … und schwupps fehlte natürlich alles :D

  5. boah. geiles teil. kannte ich noch gar nicht, bin ich doch ein arbeitsmässig verhunzlinuxter privat-win-user ;), der linux und konsole mittlerweile doch sehr mag. für mich und meine google-affinität macht google mail schon so ziemlich alles, was ich mir in feuchten mail-träumen so vorstellen kann, aber klar: das hier ist nochmal um einiges mehr an möglichkeiten. das scoring wäre mir persönlich zu komplex, bzw. würde ich für den anfang einfach genau dein muster kopieren ;).

    tolles howto!

Keine weitere Reaktionen mehr möglich.