Skip to content

Tip #14: E-Mails mit mutt automatisch verschlüsseln

Ich sinniere schon seit einiger Zeit, wie ich ausgehende E-Mails weitgehend automatisch verschlüsseln kann. Vor längerer Zeit stiess ich dabei auf das Perlskript von Martin Grandrath. Auf der Seite ist gut beschrieben, wie das einzurichten ist. Das problem am Skript ist die relativ lange Startzeit. Es vergehen in der regel mehrere Sekunden bis mutt einsatzfähig ist.

Vor kurzem unterhielt ich mich mit Jörg Sommer darüber. Er hat eine Lösung mit zsh-Mitteln gebastelt. Diese ist zudem noch wesentlich schneller als die obige Variante:


#!/bin/zsh

hook_name=send-hook
blacklist_file=$HOME/Mail/crypt_blacklist
output_file=$HOME/Mail/crypt_hook_list

setopt extendedglob

gpg_dump=( ${(f)“$(gpg --list-keys --with-colons)”} )

# filter out lines without @
people=( ${(f)"$(for line in ${(M)gpg_dump:#(pub|uid):*@*}; do 
  print ${“${(@s.:.)line}”[10]}; done)"} )

typeset -a -U addresses
# possible bad lines:
# • email@example.com  -- only an address
# • name (<…>) 
addresses=( ${${people%>}##*<} )

[[ -r $blacklist_file ]] &&
  addresses=( ${addresses:#${(j:|:)~${${(f)"$(<$blacklist_file)"}:#\#*}}} )

print -l "$hook_name\t~A\tunset crypt_autoencrypt" \
  "$hook_name\t'~t \""${(j:|:)addresses//./\\\\.}"\"'\tset crypt_autoencrypt" \
  > $output_file

Was macht das Skript? Anfangs werden zunächst ein paar Variablen festgelegt und das erweiterte Globbing der zsh eingeschalten. In der Variable gpg_dump wird alsdann die Ausgabe von gpg --list-keys --with-colons gespeichert. Nun folgt ein wenig zsh-Magic. ;-) Die Anweisung hinter people entspricht in etwa der Shellzeile awk -F: ‘/^(pub|uid)/ { print $10 }’ gpg_dump, d.h. dort liegen dann alle E-Mail-Adressen, die auf den Schlüsseln angegeben waren. Schließlich wird für alle Adressen auf der Blackliste ein enstprechender Eintrag erzeugt und die Konfiguration in die Variable output_file geschrieben.Die Adressen in der Blackliste werden entfernt. Was übrig bleibt, schreibt das Skript in Datei, deren Name in output_file gespeichert ist. Dabei muss man beachten, dass mutt nicht unendlich viele Einträge akzeptiert. Es scheint eine Begrenzung irgendwo bei 200 Einträgen zu geben.

Das ist aus meiner Sicht eine gute Alternative zu Martins Skript. Solltet ihr Anmerkungen, Fragen, Kommentare haben, schreibt mir es unten rein oder schreibt direkt eine E-Mail an Jörg.

Update: Eine Zeile im Beitrag war ungenau formuliert. Nach einem Hinweis von Jörg habe ich das verbessert.

Dringende Terminlichkeiten

Gegen Anfang Oktober erreichte mich eine Anfrage per E-Mail mit dem Betreff: Dozententätigkeit DRINGEND. Darin wurde gefragt, ob ich zu einem Thema ein Seminar halten könne. Das Ganze sei wichtig und soll noch im November durchgeführt werden. Also rief ich in der Firma an und versuchte Details im direkten Gespräch zu klären. Trotz mehrerer Versuche erreichte ich niemanden und so beantwortete ich die Anfrage per E-Mail. Antwort? Fehlanzeige! Zumindest bis zum letzten Oktoberfreitag. In dem Schreiben wurden einige meiner Fragen geklärt, Details beschrieben und es endete mit: Ich werde mich morgen telefonisch mit Ihnen in Verbindung setzen. Diese E-Mail fiel mir gerade, nach über einer Woche, in die Hände und ich frage mich, wie dringend denn die Angelegenheit ist. Ihr werdet es sicher erraten, wie oft ich in dieser Woche bisher angerufen wurde. Aber wahrscheinlich klingelt am Montag mein Telefon und der Auftraggeber fragt, ob ich nicht am Dienstag kommen kann. Schließlich steht man ja schon seit über einem Monat mit mir in Verhandlung. :-)

URL-Escapezeichen in UTF-8 wandeln

Ich stand gerade vor dem Problem, Daten aus URLs zu extrahieren. Nun kann man in eine URL nicht unmittelbar bestimmte Zeichen (Umlaute, Leerzeichen etc.) eingeben. Diese werden durch so genannte Escapezeichen markiert. Aus einem Leerzeichen wird dann %20 oder ein " wird ein %22 usw. Mein Problem bestand darin, diese Zeichen wieder zurück zu transformieren. Mit sed würde das gehen, aber einen recht hohen Aufwand darstellen. Auch weitere Programme schienen ungeeignet. Aber Maddi brachte mich auf die richtige Spur: uni2ascci. Der Aufruf ascii2uni -aJ < datei löste mein Problem. ;-)

cronjob