Thunderbird-Log unter macOS erzeugen

Für die Suche nach einem Problem mit einem IMAP-Server wollte ich unter anderem das Log des Mail-Clienten sehen. In meinem Fall ist dies Thunderbird. Thunderbird ist in der Lage Log-Dateien zu schreiben. Allerdings müssen dafür im Terminal unter macOS einige Umgebungsvariablen gesetzt werden:

export MOZ_LOG=POP3:4,IMAP:4,SMTP:4
export MOZ_LOG_FILE=~/thunderbird.log

Anschließend kann Thunderbird über das Terminal gestartet werden:

/Applications/Thunderbird.app/Contents/MacOS/thunderbird-bin

Während der Ausführung schreibt Thunderbird die entsprechenden Ereignisse in die konfigurierte Log-Datei.

curl zur Abfrage von REST-APIs benutzen

Die Aufgabe des freien Kommandozeilentools curl ist einfach beschrieben: Datentransfer. So unterstützt curl unterschiedlichste Protokolle wie FTP, HTTP, HTTPS, IMAP, SCP, SMB und viele mehr. Ein einfacher Download einer Datei über HTTP bzw. HTTPS würde mit curl wie folgt aussehen:

curl -O https://example.com/file.zip

Auch ein Transfer z.B. per FTP ist kein Problem:

ftp://example.com/file.zip

Allerdings beherrscht curl wesentlich mehr Operationen als nur das Herunterladen von Dateien. So kann curl genutzt werden, um REST-APIs zu benutzen. Diese APIs arbeiten nicht nur mit dem HTTP-Verb GET, sondern auch mit anderen Verben wie POST und PUT. Ein einfacher GET-Request wurde mittels curl wie folgt aussehen:

curl -X GET https://example.com/

Ein POST-Request wird auf die gleiche Art durchgeführt:

curl -X POST https://example.com/

Sollen zusätzlich Daten übertragen werden, so geschieht dies mit dem Parameter -d:

curl -X POST https://example.com/  -d '{
	field: "data",
	field2: "data",
	field3: "data"
}'

Damit werden die Daten im Body des Requests mitgesendet. Auch die Übergabe von Headern ist mittels curl möglich:

curl -X POST https://example.com/ 
 -H 'HeaderField: headerValue'
 -d '{
	field: "data",
	field2: "data",
	field3: "data"
}'

Manche APIs und andere Services blockieren Abrufe über curl manchmal. Dabei wird der Useragent von curl ausgesperrt. Allerdings kann dieser einfach geändert werden:

curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0" -X GET https://example.com/

Damit können solche fragwürdigen Maßnahmen, welche zum Ausschluss von curl führen, umgangen werden. Daneben verfügt curl über viele weitere Operationen bzw. Optionen. So kann z.B. mittels des Parameters -I nur der Header des Response bezogen werden:

curl -I -X GET https://example.com

Somit bietet curl die entsprechende Funktionalität um REST-APIs für Tests und ähnliches flexibel abzufragen.

Dovecot und Punkte im IMAP

Wenn man bei einen normal konfigurierten Dovecot einen IMAP-Ordner mit dem Namen “test@example.org” anlegt, wird man im Mailprogramm folgende Ordnerstruktur zu sehen bekommen:

test@example
    org

Der Grund ist darin zu finden, das der Punkt im Falle einer Maildir-Konfiguration standardmäßig als Trennzeichen eingerichtet ist. Möchte man trotzdem IMAP Ordner mit einem Punkt anlegen, so hilft das Dovecot-Plugin “Listescape”. Die Handhabung ist dabei denkbar einfach. In der “conf.d/20-imap.conf” wird dazu die auskommentierte Zeile:

#mail_plugins =

durch

mail_plugins = listescape

ersetzt. Nun muss in der Datei “10-mail.conf” im vordefinierten Namespace “inbox” der Seperator neu definiert werden:

namespace inbox {
  # Namespace type: private, shared or public
  #type = private

  separator = /

  ...
}

Er darf hier nicht auf einen Punkt gesetzt werden, da das ganze sonst nicht funktioniert. Nach einem anschließenden:

service dovecot restart

können dann auch neue Ordner mit einem Punkt im Namen angelegt werden. Auf bestehende Ordner wirkt sich das ganze allerdings nicht aus. Diese müssen bei Bedarf neu angelegt werden.

Mails von anderen Postfächern einsammeln

Seit einiger Zeit möchte ich gerne von Diensten wie Google Mail und Co. wegkommen. Dazu tragen mittlerweile auch die Enthüllungen aller PRISM und Tempora bei. Ein Feature welches sich bei Google Mail als sehr praktisch erwiesen hat, ist das Einsammeln von der Mails anderer Mailkonten. Nun ist es nicht so das es sich bei diesem Feature um Magie handelt, so das es Nahe lag das ganze in PHP nachzubauen:

<?php
  //Licensed under AGPL
  //by seeseekey

  //Configuration
  //Accounts to collect
  $collectAccounts["test@example.org"]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts["test@example.org"]["username"]="user";
  $collectAccounts["test@example.org"]["passwort"]="secret";

  $collectAccounts["spam@example.org"]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts["spam@example.org"]["username"]="user";
  $collectAccounts["spam@example.org"]["passwort"]="secret";

  //Target server
  $targetServer = "{mail.example.org/ssl/novalidate-cert}";
  $targetUsername = "user";
  $targetPassword = "secret";

  //Operate
  $mboxTarget = imap_open($targetServer, $targetUsername, $targetPassword) or die ("Failed with error: " . imap_last_error());

  //Quellpostfächer öffnen
  while (list($key,$value) = each($collectAccounts))
  {
    $mboxSource = imap_open($value["server"], $value["username"], $value["passwort"]) or die ("Failed with error: ".imap_last_error());
    $mailboxInformation = imap_check($mboxSource);
    $overviewSourceMailBox = imap_fetch_overview($mboxSource, "1:{$mailboxInformation->Nmsgs}", 0);

    //Create folder
    imap_createmailbox($mboxTarget, imap_utf7_encode("$targetServer$key"));

    foreach ($overviewSourceMailBox as $overview)
    {
      $message = imap_fetchheader($mboxSource, $overview->msgno) . imap_body($mboxSource, $overview->msgno);

      if(!imap_append($mboxTarget, mb_convert_encoding("$targetServer$key" . "" . "", "UTF7-IMAP", "ISO-8859-1"), $message,""))
      {
        die ("Error: ". imap_last_error());
      }

      //Mark mail from source mailbox as deleted
      imap_delete($mboxSource, $overview->msgno);
      }

    //Delete all marked mails and close connection to source mailbox
    imap_expunge($mboxSource);
    imap_close($mboxSource);
  }

  imap_close($mboxTarget);
?>

In dem Skript gibt man dabei oben die Konten an von welchen eingesammelt werden soll. Daneben wird natürlich auch das Zielkonto definiert. Der erste Parameter von “$collectAccounts” definiert dabei den Ordner in welchen die Mails im Zielkonto geschoben werden. Der Quellcode ist auf GitHub zu finden und steht unter der AGPL.

Gmail, der “Chats”-Ordner und IMAP

Da ich GMail auch per IMAP nutze, war ich recht verwundert, das der Ordner “Chats” nicht auftauchte. Nachdem ich ausgeschlossen hatte, das Thunderbird das Problem ist, blieb nur noch Gmail übrig. In den Einstellungen unter “Labels” fand sich dann der Übeltäter.

Dort muss der Haken bei “In IMAP anzeigen” ausgewählt sein. Danach klappt es auch mit dem IMAP im Thunderbird.