Ärger mit IMAP-Servern und dem iPad…

May 29th, 2010 in Kategorie Uncategorized |

Nein, ich bin nicht schwach geworden und habe mir ein iPad gekauft. Aber ein bekannter, um dessen Server ich mich ein wenig kümmere hatte beim Umstieg auf iMap ein Problem mit der Reihenfolge von Emails.

Das Problem

Organisiert man auf einem Courier-IMAP-Server z.B. mit Thunderbird Emails in unterschiedliche IMAP-Folder, so kann es passieren, dass die Mail-Applikation auf dem iPad mit der Reihenfolge der Mails arg ins Durcheinander gerät. Mails von 2007 liegen plötzlich vor denen von 2010. Ein Muster ist nicht zu erkennen.

Offensichtlich benutzt die iPad-Mail-Applikation zur Sortierung von Mails weder Absendedatum noch einen Zeitstempel aus dem letzten Received-Header. Stattdessen stellt das iPad Mails einfach in der Reihenfolge dar, in der sie aus dem IMAP-Server herauskommen, ohne Möglichkeit, diese sinnvoll zu sortieren.

Die Ursache

Es hat ein wenig gebraucht, herauszufinden, in welcher Reihenfolge Courier-IMAP Mails bedient. Festgelegt wird diese in der Datei courierimapuiddb im jeweiligen Maildir. Aber nach welchen Regeln sie erstellt wurde, war zunächst unklar. Die logische erste Idee waren die Timestamps im Filesystem. Die einzelnen Maildateien mit dem extrahierten Datum des “Date:”-Headers zu touchen brachte jedoch keinen Erfolg. Nach ihrem löschen wurde die courierimapuiddb beim nächsten IMAP-Zugriff in derselben Reihenfolge angelegt, in der sie bereits ursprünglich war. Also musste die Information aus einer anderen Quelle kommen.

Courier kodiert das Datum zu dem ein Mailfile angelegt wurde im ersten Tupel des Dateinamens, und diese Reihenfolge ist es auch, in der die Mails dann vom IMAP-Server geliefert werden.

1269355584.M281362P1986V000000...

1
2
3
srv:~# perl -le 'print scalar localtime 1269355584'
Tue Mar 23 15:46:24 2010
srv:~#

Die Lösung

Folgende Schritte sind notwendig um die Mails für das iPad nach dem Datum zu sortieren:

  • Herausziehen des “Date:”-Headers aus dem Mailfile (Hier wäre auch der letzte Received-by-Eintrag sinnvoll, da dies der Zeitpunkt des Empfangs und nicht des Versands ist, aber das wäre umständlicher zu parsen)
  • Konvertieren des Datums in einen Unix-Timestamp
  • Ersetzen des aktuellen Timestamps (1. Segment im Dateinamen bis zum Punkt) durch diesen neuen Timestamp
  • Löschen der Datei courierimapuiddb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/sh
 
# terminate on any uncaught error
set -e
 
# I used to use for f in `find ...` but that delimits on words, not lines.
# 'while read f' stores the whole line in f, so there's no problem with directories of filenames
# containing whitespace.
ls | while read f; do
    # 'date +%s' outputs a unix timestamp
    # 'date -d SOME_STRING' parses the specified time in SOME_STRING.
    # perl finds the line that starts with 'date: ' and prints the date that follows this tag
    # The head makes sure, only the first field is found, so no problems with mail-attachments  occur
    # if the date command throws an error, the file is ignored and the loop continues at the next iteration
    t=$( date +%s -d "$( perl -lane '/^date: (.*)$/i && print $1' $f | head -1 )" ) || continue
 
    # echo the original filename through perl, which replaces the courier timestamp with the one just calculated.
    # Note the double quotes to access the shell variable, not a perl variable
    new_f=$( echo $f | perl -lne "s/^\d+/$t/; print" )
    # if old and new name are identical, just print a message
    if [ "$f" = "$new_f" ]; then
        echo "    same\t$f\t$new_f"
    else
        #echo "not same\t$f\t$new_f"
        mv $f $new_f
    fi
done

Lässt man dieses Script im Verzeichnis mit den einzelnen Mailfiles laufen, benennt es diese alle nach dem Absendedatum um. Jetzt muss erneut courierimapuiddb gelöscht werden, da hier ja die falsche Reihenfolge noch festgelegt ist.

Beim nächsten Zugriff wird die Datei neu angelegt und diesmal sollte die Reihenfolge auch im iPad nach dem Datum korrekt sein.

(#include fiesen Seitenhieb auf die Qualität der Mail-App im iPad, die offensichtlich nichtmal nach Feldern sortieren kann)

Dein Kommentar


Formatierung mit Textile ist erlaubt.