Möchte man den weit verbreiteten Kommandozeilen-MUA Mutt (http://www.mutt.org/) im Terminal oder iTerm (einer übrigens recht schönen Alternative zu Terminal.app) unter Mac OS X verwenden, so sind einige kleinere Hürden zu überwinden. Die praktikabelste Variante ist meiner Meinung nach die Installation aller erforderlichen Pakete aus dem MacPorts-Projekt. Und genau das ist das Thema dieses Artikels.
Folgende Pakete müssen (ggfs. nach vorherigem Setup der MacPorts-Umgebung) zunächst installiert werden:
sudo port install gpgme +smime sudo port install keychain t-prot wget w3m urlview elinks sudo port install dirmngr
Wichtig ist das „+“ in der ersten Zeile, weil es die Variante mit S/MIME-Unterstützung von gpgme installiert!
t-prot, eine ganz nette Software zur TOFU Protection ist optional, mir aber öfter als mir lieb ist ziemlich hilfreich. 😉
— Das hier braucht man anscheinend inzwischen nicht mehr: —
Bei mir ging allerdings die dritte Zeile, also das Kompilieren von dirmngr schief. Das lag daran, dass es Probleme mit der Version der libassuan aus den MacPorts gibt. Für den dirmngr aus MacPorts ist die zu neu. Deshalb habe ich ein aktuelleres dirmngr-Päckchen von http://www.gnupg.org/ herunter geladen, entpackt und kompiliert:
cd /opt sudo mkdir software sudo chmod 777 software cd software wget ftp://ftp.gnupg.org/gcrypt/dirmngr/dirmngr-1.1.0.tar.bz2 tar xjf dirmngr-1.1.0.tar.bz2 cd dirmngr-1.1.0 CPATH='/opt/local/include' CFLAGS='-pipe -O2 -arch x86_64' \ CPPFLAGS='-I/opt/local/include' \ CXXFLAGS='-pipe -O2 -arch x86_64' \ LIBRARY_PATH='/opt/local/lib' \ MACOSX_DEPLOYMENT_TARGET='10.6' \ LDAPLIBS='-lldap -llber' CXX='/usr/bin/g++-4.2' \ F90FLAGS='-pipe -O2 -m64' \ LDFLAGS='-L/opt/local/lib -arch x86_64' \ FCFLAGS='-pipe -O2 -m64' OBJC='/usr/bin/gcc-4.2' \ INSTALL='/usr/bin/install -c' \ OBJCFLAGS='-pipe -O2 -arch x86_64' FFLAGS='-pipe -O2 -m64' \ CC_PRINT_OPTIONS='YES' CC='/usr/bin/gcc-4.2' \ ./configure --prefix=/opt/local make sudo make install
Die ziemlich lange, oft umgebrochene configure-Zeile mit den vielen Variablen habe ich mir aus der Variante zusammen gebastelt, die MacPorts zum Konfigurieren der (älteren) dirmngr-Version aus dem Repository verwendet. Sicherlich braucht man viele der Variablen nicht, ich hab sie aber einfach mit genommen, weil ich ehrlich gesagt zu faul war, das mehr als nötig zu optimieren. Da kommt es im Wesentlichen darauf an, dass beim Kompilieren die Libraries gefunden werden. Das Binary landet dann nach dem make in /opt/local/bin.
— Den Abschnitt bis hier braucht man anscheinend inzwischen nicht mehr. —
Im Anschluss daran können wir die mutt-devel Version aus den MacPorts installieren. Auch hierbei sind ein paar „variants“ zu beachten (die mit „+“):
sudo port install mutt-devel +ssl +headercache +sasl +smtp +gpgme sudo port install muttprint
Das sollte anstandslos durch laufen und anschließend müsste der Befehl
mutt
zumindest irgendwie einen Mutt zum Vorschein bringen.
Bevor wir den Mutt wirklich verwenden können, müssen wir ihn erstmal konfigurieren. Das geschieht am einfachsten, indem wir ein Verzeichnis .mutt erzeugen und darin die komplette Konfiguration abwickeln. Die zentrale Konfigurationsddatei heißt dann .mutt/muttrc und sollte für den Anfang folgenden Inhalt haben:
# Some basics set realname="Real Name" set from="Real Name <real.name@provider.de>" set signature=~/.mutt/signature set alias_file=~/.mutt/mail_aliases # IMAP Configuration set folder="imap://mail.provider.de/" set spoolfile="=INBOX" set mbox="=INBOX" mailboxes imap://mail.provider.de/INBOX set imap_check_subscribed=yes set imap_user=username set imap_pass=`head -1 ~/.mutt/passwd` set header_cache="~/.mutt/hcache/" set smtp_url="smtp://username@mail.provider.de:587" set certificate_file=~/.mutt/certificates set mail_check=60 # Pager Configuration set pager_context=4 set pager_index_lines=10 set pager_stop # Printing set print_command="muttprint -1 -P A4 -C 'ps2pdf - - | open -a preview -f' -z 10pt" set print_split=Yes # Editing set editor="vim \"+set filetype=mail\"" set locale="de_DE" set charset=utf-8 set send_charset=us-ascii:utf-8:iso-8859-1:iso-8859-15 # Additional headers my_hdr Bcc: real.name@provider.de unset record my_hdr X-Editor: `vim --version | grep "VIM - Vi IM" | sed 's/(.*)/\<http:\/\/www.vim.org\>/g'` my_hdr User-Agent: Mutt/`mutt -v | head -1 | cut -f 2- -d " "` `uname -sr | cut -f1 -d-` set reverse_name unset reverse_realname charset-hook unknown-8bit ISO-8859-1 set folder_format="%2C %t %4N %F %2l %-8.8u %-8.8g %8s %d %f" # format of the folder list set index_format="%4C %M %Z %[%y/%m/%d %H:%M] %-18.18F (%4l/%4c) %s" # format of the index set edit_headers set allow_8bit set noconfirmappend set sort=threads #set sort_aux=last-date-received set strict_threads=Yes set keep_flagged set move=ask-yes set delete=yes set mime_forward=ask-yes alternative_order text/enriched text/plain text/html text auto_view text/html # GnuPG and S/MIME stuff set crypt_use_gpgme=yes set pgp_use_gpg_agent=yes set crypt_replyencrypt=yes set crypt_replysign=yes set crypt_autosign=yes set pgp_timeout=3600 set smime_is_default=yes set smime_default_key="xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" # TOFU Protection Configuration (you need to install t-prot) set my_tprot_cmd="t-prot -acelmt -S=5 -Mmutt --sigsmax --bigq --pgp-move --pgp-short --pgp-move-vrf" set display_filter=$my_tprot_cmd # toggle TOFU protection with ESC-0 and ESC-1 macro generic \e0 ":unset display_filter\n" "Turn TOFU protection off" macro generic \e1 ":set display_filter='$my_tprot_cmd'\n" "Turn TOFU protection on" # same in pager mode - ugly but what the hell... macro pager \e0 ":unset display_filter; exec exit\n:exec display-message\n" "Turn TOFU protection off" macro pager \e1 ":set display_filter='$my_tprot_cmd'; exec exit\n:exec display-message\n" "Turn TOFU protection on" # Other configuration files source ~/.mutt/colors-blackback source ~/.mutt/mail_aliases
In die Datei .mutt/signature sollte eine Signatur, die unter jeder E-Mail vom Mutt automatisch eingefügt wird. Möchte man das nicht, kann man entweder einfach eine leere Datei erzeugen oder die Zeile mit set signature=... in der muttrc auskommentieren.
Falls Mutt sich später beim Starten über das Fehlen der Datei .mutt/mutt_aliases beschwert, dann sollte man einfach eine leere Datei anlegen.
Die Einstellungen im Block „IMAP Configuration“ müssen natürlich dem Provider entsprechend angepasst werden. Die Parameter sind alle in der Mutt-Dokumentation erklärt.
Im Block „Printing“ ist konfiguriert, dass Mutt beim Auslösen des Druck-Befehls einfach das in Mac OS X integrierte Vorschau-Programm öffnet. Von dort aus kann man dann die Mail drucken oder als PDF-Datei speichern. Das ist recht praktisch.
Im Block „Additional Headers“ ist konfiguriert, dass jede Mail automatisch als Blindkopie an die dort angegebene Adresse gesendet wird. Die Adresse sollte unbedingt korrigiert oder die Zeile auskommentiert werden.
Im Block „GnuPG and S/MIME stuff“ weiter unten in der Datei muss später der Fingerprint des S/MIME-Schlüsselpärchens eingegeben werden.
Ganz am Ende wird auf die Datei colors-blackback verwiesen, die einige Farbdefinitionen enthält, die in Terminals mit schwarzem Hintergrunf toll aussehen. So sieht die Datei colors-blackback aus:
# text colors - general functions color normal white default # normal text color status white blue # status bar, last and first row color search yellow red # search results color message yellow default # information messages, last row color error brightred default # error messages, last row color markers brightcyan default # the + sign at the start of broken lines # text colors - message index and attachment menu color indicator white red # current message selected color tree brightred default # Threads' arrow color index yellow default ~F # important messages ! flag - command "F" color index green default ~N # new messages N flag - command "N" color index magenta default ~T # tagged messages * flag - command "t" color index green default ~U # unread messages color index blue default ~D # deleted messages D flag - commands "d"/"u" # text colors - pager color hdrdefault yellow default # headers color header green default ^(From|Subject): # header from: subject: color header red default ^Resent-[^:]+: # resent header color bold green default # bold on mails' body color underline yellow default # underlined color attachment magenta default # attachments color signature blue default color tilde magenta default color quoted magenta default # Ronald J Kimball's url regexp. mutt-user 04/05/28 color body magenta default "(https?|ftp|gopher|finger)://([^"'"'"' \t\r\n)>.,!?&]\ |[.,!?][^"'"'"' \t\r\n)>.,!?&]|&([^g]|$)|&g([^t]|$)|>([^;]|$))+" color body red default "[-a-zA-Z_0-9.+]+@[-a-zA-Z_0-9.]+" # enphasized text color body green default "[*][-[:alnum:]]+[*]" color body green default "[ ]_[-[:alnum:]]+_([ ]|\.)"
Folgende Zeilen sollten wir anschließend noch in die Datei ~/.mailcap (direkt im Homeverzeichnis des Users, nicht im Verzeichnis .mutt) schreiben, damit Mutt einigermaßen komfortabel HTML-Parts anzeigen und PDF-Dateien öffnen kann:
text/html; /opt/local/bin/w3m -dump -T text/html '%s'; copiousoutput; description=HTML Text; nametemplate=%s.html application/pdf; open '%s'; copiousoutput; needsterminal image/png; open '%s'; copiousoutput; needsterminal image/jpeg; open '%s'; copiousoutput; needsterminal
Nach der Mutt-Konfiguration müssen wir uns nun dem Thema S/MIME widmen. Ich gehe davon aus, dass bereits ein S/MIME-Zertifikat vorhanden ist. Üblicherweise liegt das im PKCS#12-Format vor. Man bekommt das, wenn man das Zertifikat beispielsweise aus dem Firefox exportiert.
Im folgenden gehe ich davon aus, dass die Datei mit dem S/MIME-Zertifikat bundle.p12 heißt. Dann sind folgende Schritte nötig, um alles für den Mutt vorzubereiten:
openssl pkcs12 -in bundle.p12 -out bundle.pem -nodes openssl pkcs12 -in bundle.p12 -out certs.pem -nokeys -nodes openssl pkcs12 -in bundle.pem -export -out key.p12 -nocerts -nodes
Beim Exportieren in die Datei key.p12 wird im folgenden angenommen, dass als Passphrase „passphrase“ eingegeben wurde. Die muss leider im folgenden einmal auf der Kommandozeile eingegeben werden (man kann das danach ja mit geeigneten Mitteln aus der Bash-History löschen):
gpgsm --call-protect-tool --p12-import -P passphrase --store key.p12 gpgsm --import chain.pem gpgsm --import certs.pem
In der Datei chain.pem sollten sich die benötigten Root-Zertifikate befinden. Anschließend sollte noch eine Trustlist erzeugt werden:
gpgsm --list-keys 2>/dev/null | grep fingerprint | awk '{print $2 " S"}' >> ~/.gnupg/trustlist.txt
Damit hat sich’s eigentlich. Der Fingerprint des eigenen Zertifikats muss noch in die Mutt-Konfiguration, man bekommt ihn mit folgendem Befehl raus:
gpgsm --list-secret-keys
Meine Mutt-Konfiguration ist inzwischen um einiges gewachsen, aber das hier beschriebene sollte eigentlich ausreichen um eine lauffähige, halbwegs komfortable Umgebung zu bekommen.