Ich hatte irgendwann mal angefangen, interessante Zitate zu sammeln, die ich vor Jahren, als ich noch Microsofts Entourage verwendet hatte, immer im Zufallsprinzip als Signatur an meine E-Mails angehängt hatte.

Nach dem Umstieg von einem zum anderen E-Mail-Programm (man will ja immer mal was Neues testen), ging mir diese Funktionalität flöten.
Entweder unterstützte das E-Mail-Programm nur eine Signatur oder die Signaturen ließen sich nicht zufällig auswählen oder ich bekam die 200 vorhandenen Zitate nicht importiert.

Letzteres gilt besonders für Apples Mail. Bietet inzwischen so alles, was man sich von einem E-Mail-Programm wünscht, importieren und exportieren kann man seine Signaturen allerdings nicht.

Nach einem kleinen Blick in den Library-Ordner habe ich dafür ein kleines Skript geschrieben, mit welchem man Signaturen in Apple Mail importieren kann.

Die Signaturen in Apple Mail tauchen an drei Stellen im Preferences-Ordner ~/Library/Mail/V2/MailData/Signatures auf:

  1. Jede vorhandene Signaur ist in Form einer xml-Datei .mailsignature abgelegt
  2. Alle Signaturen werden in der Datei AllSignatures.plist mit Signatur-Name zusammengefasst
  3. Die ID jeder .mailsignature-Signatur wird in der Datei AccountsMap.plist aufgeführt, so dass die Signatur in den Mail-Voreinstellungen nicht nur unter "Alle Signaturen", sondern auch unter dem aktiven Mail-Account auftaucht

Was brauchen wir für den Import?

  • Das gelistete Perl-Skript
  • Eine Text-Datei mit den zu importierenden Signaturen, die UTF-8 kodiert sein sollte, und die mehrere Trennstriche --- hintereinander als Abtrennung zwischen den einzelnen Zitaten haben sollte

Beispiel Textdatei:

Dies ist meine erste Signatur

---

Noch eine Signatur

---

Noch eine weitere Signatur

Perl-Skript:

#!/usr/bin/perl

my $OUTDIR  = "signaturen";
my $SIGLIST = "fuer_AccountsMap_plist.txt";
my $ALLSIGS = "AllSignatures.plist";

if (!-f @ARGV[0]) {
        print "Eingabedatei ", @ARGV[0], " konnte nicht gefunden werden.\n";
        exit 0;
        }

if (-d $OUTDIR) {
        print "Ausgabeordner existiert bereits. Bitte entfernen Sie den Ordner zuerst.\n";
        exit 0;
} else {
        `mkdir $OUTDIR`
        }

my $filenum     = 0;
my $sigfilename = "E8FFEB99-319E-4174-9809-55554E89%04s";

open(SIGNATUR, "<".@ARGV[0]);
open(SIGLIST, ">$OUTDIR/$SIGLIST");
open(ALLSIGS, ">$OUTDIR/$ALLSIGS");


# Kopf der AllSignatures.plist erstellen
print ALLSIGS '<?xml version="1.0" encoding="UTF-8"?>', "\n";
print ALLSIGS '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">', "\n";
print ALLSIGS '<plist version="1.0">', "\n";
print ALLSIGS '<array>', "\n";

newSig(1);
while (<SIGNATUR>) {
        if ($_ =~ m/-{2,}/) {
                newSig(0);
        } else {
                my $txt = $_;
                $txt =~ s/ä/ä/g;
                $txt =~ s/ö/ö/g;
                $txt =~ s/ü/ü/g;
                $txt =~ s/Ä/Ä/g;
                $txt =~ s/Ö/Ö/g;
                $txt =~ s/Ãœ/Ãœ/g;
                $txt =~ s/ß/ß/g;
                $txt =~ s/[\n\r]/<br\/>/g;
                print SIG $txt;
                }
        }

# Fuß der AllSignatures.plist erstellen
print ALLSIGS '</array>', "\n";
print ALLSIGS '</plist>', "\n";

# Fuß in letzter Signatur
print SIG "</BODY>", "\n";
print SIG "</HTML>=", "\n";


close(SIG);
close(ALLSIGS);
close(SIGLIST);
close(SIGNATUR);


# Neue Signatur-Datei
sub newSig($$) {
        my ($start) = @_;
       
        if ($start ne 1) {
                print SIG "</BODY>", "\n";
                print SIG "</HTML>=", "\n";
                close(SIG);
                }
       
        print ALLSIGS "\t<dict>", "\n";
        print ALLSIGS "\t\t<key>SignatureIsRich</key>", "\n";
        print ALLSIGS "\t\t<false/>", "\n";
        print ALLSIGS "\t\t<key>SignatureName</key>", "\n";
        print ALLSIGS "\t\t<string>Signatur ", ++$filenum, "</string>", "\n";
        print ALLSIGS "\t\t<key>SignatureUniqueId</key>", "\n";
        print ALLSIGS "\t\t<string>", sprintf($sigfilename, $filenum), "</string>", "\n";
        print ALLSIGS "\t</dict>", "\n";
       
        print SIGLIST "<string>", sprintf($sigfilename, $filenum), "</string>\n";
       
        open(SIG, ">$OUTDIR/".sprintf($sigfilename, $filenum).".mailsignature");
        print SIG "Content-Transfer-Encoding: quoted-printable", "\n";
        print SIG "Content-Type: text/html;", "\n";
        print SIG "     charset=iso-8859-1", "\n";
        print SIG "Message-Id: <", sprintf($sigfilename, $filenum), "@fritz.box>", "\n";
        print SIG "Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\))", "\n";
        print SIG "\n";
        print SIG "<HTML>", "\n";
        print SIG "<BODY>", "\n";
        print SIG "---<BR><BR>", "\n"; 
        }

Verwendung

Perl-Skript ist wie folgt zu verwenden:

zitate.pl /pfad/zur/textdatei.txt

Es wird (in dem Verzeichnis des aktuellen Terminal-Pfades) ein Ordner signaturen angelegt, der eine Reihe .mailsignature-Dateien, eine AllSignatures.plist-Datei und die Datei fuer_AccountsMap_plist.txt enthält.

  1. Apple Mail beenden
  2. Alle .mailsignature-Dateien und die Datei AllSignatures.plist aus dem Verzeichnis ~/Library/Mail/V2/MailData/Signatures entfernen
  3. Verbleibende Datei AccountsMap.plist öffnen (ggf. vorher Backup anlegen), alle Einträge innerhalb des <wikitext><array></wikitext>-Tags entfernen (siehe Bild rechts) und nun alle Einträge aus der generierten Datei fuer_AccountsMap_plist.txt an dieser Stelle einfügen
  4. Alle generierten .mailsignature-Dateien und die AllSignatures.plist-Datei in eben dieses Verzeichnis ~/Library/Mail/V2/MailData/Signatures verschieben
  5. Apple Mail wieder öffnen. Es sollten nun alle Signaturen im Voreinstellungs-Dialog vorhanden sein.