courier, dovecot, sieve, push mail

Monday, January 23. 2012

 Courier tat seine Arbeit an sich wunderbar, aber in der Integration von desktop- und mobilem Mailabruf stand es mir dann doch im Wege. Ich wollte

  • mail-Sortierung und -filterung auf dem Server
  • dazu gerne das sieve-Addon zu ThunderBird nutzen
  • push-mail für k-9 mail auf meinem android verlaesslich und doch batterieschonend einrichten

Das sprach für einen Wechsel von Courier zu dovecot. Dabei habe ich auf debian oldstable (Lenny) einige Varianten durchprobiert.

Ein paar hilfreiche WebSeiten vorweg, Migration to Dovecot (1.0), Courier to Dovecot 

courier -> dovecot 1.0

Der erste Anlauf blieb geradewegs im Rahmen des in der Distribution enthaltenen:

apt-get install dovecot-imapd dovecot-pop3d
dovecot --version  (1.0.15-2.3+lenny1)

Weiter, nach Maßgabe des dovecot-Wiki, mit dem Script zur Migration der Daten

cd /usr/local/bin
mkdir dovecot-mig
cd dovecot-mig/
wget http://www.dovecot.org/tools/courier-dovecot-migrate-1.0.pl
./courier-dovecot-migrate-1.0.pl --recursive --convert /home

Und zur Dovecot - Konfiguration:

Für SSL bietet dovecot.conf viele Felder aber ich wollte einfach das auch für Courier eingesetzte chained certificate weiterverwenden, ging so:

joe dovecot.conf

# chained certificate doppelt eintragen
ssl_cert_file = /etc/ssl/certs/startssl/mail.domain.tld.pem
ssl_key_file = /etc/ssl/certs/startssl/mail.domain.tld.pem

# dovecot 1.0 lauscht so an IPv4 und IPv6 
listen = [::] 

# Pfad zum maildir
mail_location = maildir:~/Maildir

# namespace wie courier
namespace private {
  prefix = INBOX.
  separator = .
  inbox = yes 
}

dovecot neu starten:

/etc/init.d/dovecot restart

Ergebnis? Beim ersten start des MUA (Thunderbird) gab es einen Wald von Messageboxen und Thunderbird war eine Weile beschaeftigt, Mails zu synchronisieren. Ansonsten gings soweit ohne Drama, nur das Mail-filtern wollte nicht.

 

courier -> dovecot 1.2

Im zweiten Anlauf habe ich, auf einem anderen server, die in den backports vorgehaltene Version dovecot 1.2 installiert:

# backports in sources.list eintragen
joe /etc/apt/sources.list
deb http://www.backports.org/debian lenny-backports main contrib non-free

# und der key dazu, sonst nervt apt-get bei jedem Aufruf
sudo wget -O - http://backports.org/debian/archive.key | sudo apt-key add -
sudo apt-get update
sudo apt-get -t lenny-backports install dovecot-common dovecot-pop3d dovecot-imapd

 

Weiter, nach Maßgabe des dovecot-Wiki, mit dem Script zur Migration der Daten in der version fuer dovecot 1.1+

cd /usr/local/bin
mkdir dovecot-mig
cd dovecot-mig/
wget http://www.dovecot.org/tools/courier-dovecot-migrate.pl
./courier-dovecot-migrate.pl --recursive --convert /home

 

# die Anpassungen der Konfig
joe /etc/dovecot/dovecot.conf

# managagesieve und lda bringen die Mailsortierung auf dem server zuwege
protocols = imap pop3 pop3s imaps managesieve lda

# sowohl auf IPv4 wie IPv6 lauschen
listen = *, [::] 

# im default verbietet dovecot Klartext-Passworte, aber hier haette es manche Klienten ausgesperrt
disable_plaintext_auth = no

# chained cert doppelt eintragen
ssl_cert_file = /etc/ssl/certs/startssl/mail.domain.tld.pem
ssl_key_file = /etc/ssl/certs/startssl/mail.domain.tld.pem

# lda ist der local delivery agent und stoesst das sieben und reindizieren der mails bei Auslieferung an
protocol lda {
postmaster_address = master@server.domain
mail_plugins = sieve
}

# sieve_dir ist das Verzeichnis, in dem Filterscripte abgelegt werden. unter dovecot 1.2 ist deren Name beliebig
plugin {
sieve = ~/.dovecot.sieve
sieve_dir = ~/mails/sieve
}

Konfig speichern und dovecot neu starten

/etc/init.d/dovecot restart

Damit der lda deliver nun auch benutzt wird, muss er postfix bekannt gemacht werden:

joe /etc/postfix/main.cf

mailbox_command = /usr/lib/dovecot/deliver
 
Speichern und geanderte Konfig laden:
/etc/init.d/postfix reload

Auch hier gab es mit Thunderbird zuerst mal Messageboxen und Resynchronisierung, aber dann liessen sich zur Belohnung Filterregeln für's serverseitige Filtern aus Thunderbird heraus editieren und es ging auch.


 dovecot 1.2 -> dovecot 2.0

den Anstoss für dieses Upgrade gab ein Blog-Artikel von Peter Kieser mit der Argumentation:

  • push funktioniert auf IMAP, indem zwischen dem Client und dem Server die Verbindung IDLE offengehalten wird. Alle paar Minuten werden "OK Still here"-Nachrichten ausgetauscht.
  • Wenn das geschieht, reaktiviert Android eine reihe ruhende Netzwerk-Funktionen und die ziehen Strom, je häufiger das geschieht, je mehr leidet die Batterielaufzeit.
  • K-9 hat als default einen refresh alle 24 Minuten, dovecot aber alle 2 Minuten.
  • mit dovecot 1.2 laesst sich daran per Config nichts ändern, Dovecot 2.0 hat dagegen einen Parameter imap_idle_notify_interval 

Dovecot 2.0 gibt es für Lenny als Prebuilt Binary, Upgrading Dovecot v1.2 to v2.0 im dovecot-wiki hilft auch weiter.
Als erstes /etc/dovecot/dovecot.conf in ein backup sichern, so dass im weiteren nichts verloren geht, auch wenn man im install die dovecot.conf durch die neue Version ersetzen laesst!

cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.1-2

 

# apt sources.list erweitern
joe /etc/apt/sources.list
 
# lenny is oldstable
deb http://xi.rename-it.nl/debian/ oldstable-auto/dovecot-2.0 main

# speichern, dann key besorgen
wget -O - http://xi.rename-it.nl/debian/archive.key | apt-key add -
 
# und dovecot 2 installieren
apt-get update && apt-get upgrade
apt-get install dovecot-imapd dovecot-pop3d dovecot-managesieved

 

# die Konfigurationsdateien sehen für dovecot 2.0  einiges anders aus, die in dovecot 1.2 schon sehr umfangreiche dovecot.conf ist nun viel kuerzer und inkludiert stattdessen Konfigurationsdateien aus einem gesonderten Verzeichnis. Und optional eine local.conf, die ich mit diesen Einträgen angelegt habe:

 

# /etc/dovecot/local.conf
mail_location = maildir:~/Maildir
namespace {
  inbox = yes
  location = 
  prefix = INBOX.
  separator = .
  type = private
}
passdb {
  driver = pam
}
plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
}
protocols = " imap pop3 sieve "
ssl_cert = </etc/ssl/certs/startssl/mail.domain.tld.crt
ssl_key = </etc/ssl/certs/startssl/mail.domain.tld.key
ssl_ca = </etc/ssl/certs/startssl/startssl.chain.class1.server.crt
 
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  inet_listener sieve_deprecated {
    port = 2000
  }
}
 
userdb {
  driver = passwd
}
protocol imap {
  imap_idle_notify_interval = 29 mins
  mail_max_userip_connections = 60
}
 
protocol lda {
  postmaster_address = postmaster@datenwusel-hosting.de
  mail_plugins = sieve
  log_path = /var/log/dovecot/deliver.log
  info_log_path = /var/log/dovecot/deliver-info.log
}
disable_plaintext_auth = no
auth_cache_size = 5M
log_timestamp = "%Y-%m-%d %H:%M:%S "
 
Bei der Gelegenheit habe ich auch das courier-style - .pem beurlaubt und ssl key, cert, ca einzeln eingebunden. Mehr dazu hier.
Anschliessend dovecot neu starten und dann in /etc/postfix/main.cf eine kleine Änderung vornehmen:
mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"
 
Ich musste auch den Namen der Datei mit den Filterregeln umbenennen, da nur noch Dateien mit der extension .sieve interpretiert werden.
 
sieve error log

Wenn der lda bei der Abarbeitung des sieve-scriptes einen Fehler feststellt, etwa wg eines Tippfehlers, einen Ordner nicht findet, schreibt er eine Fehlermeldung in ~/.dovecot.sieve.log 

fail2ban - Regel für dovecot

Auch hierzu wird man im dovecot-wiki fündig.

 

push mail und (android-app) juice defender

Die beiden stehen sich schon im Weg, juice defender erzielt seine laufzeitverlängernden Wirkungen nicht zuletzt, indem es die Datenverbindung des smartPhone nur periodisch aktiviert. Mit den default-Einstellungen hatte es bei mir schon merklich was bewirkt, aber der push mail zuliebe habe ich es deaktiviert.

 

Zielkonflikt zwischen sieve und push-imap

Quasi als Schlussbemerkung hier, warum ich nach erfolgreicher Migration, upgrades, Konfiguration doch nicht ganz zufrieden wurde:

  • sieve unterstuetzt nun serverseitig mein Mail-Ablage-Modell eines weitverzweigten hierarchischen Ordnerbaums mit deutlich > 100 systematisch/thematischen Ordnern. Ich kann von verschiedenen Orten (desktop, smartPhone, fremder Rechner) und MUA (ThunderBird, K-9, WebMail) darauf zugreifen und finde alles sortiert.
  • imap-push zwischen dovecot (2.0) und k-9 funzt an sich auch wunderbar und mit dem auf 24//29 Minuten gestreckten Refresh-Interval auch halbwegs batterieschonend.
  • Aber: imap-push hält je "push-aktivem" Ordner eine imap-idle - Verbindung offen. Ein anderes Model (nur eine Verbindung zwischen Client und Server bleibt idle offen, notify übergibt den Pfad zum aktualisierten Ordner) ist in der Mache, aber derzeit eben Zukunftsmusik. Das heisst konkret: mit 2, 3, 5 aktiven Ordnern ist alles bene, mit 127 hängt und klemmt es an allen Enden.
  • mein Mail-Ablage-Modell dient dem Zweck, deduktiv/systematisch alte Mails wiederzufinden, imap-push dient dem Zweck, neue Mails sofort annonciert zu bekommen. Meine Wunschvorstellung war, dass k-9 und ThunderBird mir '''pling!''' sofort die neue Mail an ihrem systematischen Ort vor die Nase halten. Mit dem derzeitigen Stand der Protokolle geht das (bei vertretbarem Energieaufwand des smartPhone) aber nicht zusammen.
  • meine Loesung ist dafür bis auf weiteres:
    mobil: je ein account je Nutzung
    .
    • Ein Mail-account hält die hierarchische Ordnerliste, hier gibt es kein imap-push und keine regelmässige Synchronisierung, aktualisiert wird also nur bei Zugriff, und nur auf dem je gewünschten Pfad.
    • Ein zweiter Mail-Account bekommt per .forward die selben neuen Mails zugestellt, alles unsortiert in die INBOX. Push macht sein Ding und das macht es gut. Wenn ich wirklich zu der neuen Mail den Kontext der vorigen brauche, kann ich ja auf dem anderen Konto nachsehen.



Leider habe ich nicht zurückverfolgen können, was eigentlich den Auslöser davon darstellte, gefühlt schien das K9 - Mail meines android zu spinnen: neu angelegte Unterordner auf dem imap-Server wurden da nicht angezeigt und beim Abruf neuer Nachrichten gab es oft reihenweise Fehlermeldungen (ssl-handshake fail). Alle Versuche, K9 mit veränderten Einstellungen zu heilen, schlugen fehl. 
Bis ich mir dann mal die Zeit nahm, auf den Server zu schauen und dort im mail.log viele Fehlermeldungen wie diese fand:

imapd-ssl: Maximum connection limit reached for (und die IP)

Wobei an dem Server nicht eben viele Clienten hingen, sondern genau zwei: ein Thunderbird und eben K9 auf dem Androiden. Die in den Fehlermeldungen gelisteten IPs liessen sich ohne Zweifel und Ausnahme auf das Android-Telefon zurückführen.
Google lieferte mir einen vergleichbaren Problembericht von jmd., dermit Thunderbird und einem OSX Mail auch diesen Fehler sah und ihn dort auf Mail zurückführte, wie bei mir tauchte die IP des Rechners mit Thunderbird nie auf. Auch dort kam nicht heraus, warum eine anfangs funktionierende Einrichtung dann diese Fehler warf, aber eine Abhilfe habe ich gefunden.

In /etc/imapd-ssl habe ich diese beiden Einträge angefügt:

MAXDAEMONS=280
MAXPERIP=40

noch ein /etc/init.d/courier-imap-ssl restart und seither ist Ruhe und K9 kommt auch wieder klar.

HTC Desire rooten

Friday, May 27. 2011

Bislang waren meine Versuche, mein Desire (mit Vodafone_uk - Branding, Bootloader 0.93, Froyo) zu rooten, gescheitert. unrevoked startete (auf Debian Squeeze / 64) entweder gar nicht oder mit Fehlermeldungen.
"No protocol specified
Error: Unable to initialize gtk, is DISPLAY set properly?"
64 Bit mag es wohl nicht.  Eine Live-Distro (mint gefiel mir gut) mit 32 Bit half über die erste Hürde.

Nun startete unrevoked, fand, bearbeitete und rebootete auch das Desire, aber dort erschien nur der Hinweis, die Anwendung zysploit sei unerwartet beendet worden, und unrevoked meldete dann "Error: failed to get root. Is your firmware too new?" 
Ich hatte da mal ein OTA update akzeptiert und hielt das Desire schon für unrootbar. Aber dann stiess ich auf Berichte, dass es auch mit HBOOT 0.93 klappen kann und versuchte es erneut.  

Weitergeholfen hat mir letztlich ein Tip von dieser Seite: Nämlich, vor dem Durchgang auf dem Desire die Anwendung Evo Zysploit zu desinstallieren. Die war da wohl von einem vorigen Anlauf mit einer älteren Version von unrevoked (3.22) noch übrig und im Wege. 

Und dann ging's auf einmal. unrevoked 3.32 lief durch und jetzt habe ich den Befehl su. Und eine Reihe anderer - hier die Liste der ADB Shell Command Reference

Bei dem und den folgenden Schritten (Backups ziehen, anderes ROM flashen) war es mir sehr beruhigend, verständliche Hintergrundinfos und Howtos zu haben, und die Brutzelstube  hat davon einen ganzen Sack voll!

Anschliessend kam ein Custom rom drauf, anhand dieser howto zu Vorbereitung und flashen. Das klappte erst mal gar nicht: obwohl ich brav jeden Schritt wie angeleitet nachvollzogen hatte, mochte mein Desire partout nicht mit dem neuen rom booten. Ich bekam den weissen Screen mit dem htc-Logo und das war's dann, egal wie lange ich wartete.

Problem 1 war, wie ich dann entdeckte, dass bei der Partitionierung/Formatierung der ext3-Partition auf der sd-card etwas schief gegangen war. gparted  akzeptierte das angestöpselte Desire klaglos als card reader, sah auch beide Partitionen aber auf der der neuen kein Format. Mit diesem tool die ext-Partition noch etwas vergroessert und formatiert, dabei den Partitionen gleich noch sprechende Namen gegeben und die Fehlermeldungen zum mounten der sd-ext waren Vergangenheit.

Es bootete aber immer noch nicht. Was jetzt half, war im recovery den Eintrag advanced zu wählen und hier jedes angebotene  wipe auszuführen (dalvik cache, battery stats). Welches von beiden letztlich das Hindernis ausräumte, weiß ich nicht, aber dann klappte es endlich und auf dem desire quieckte die Bootanimation von LeeDrOiD 2.4.1. Am nächsten Morgen noch mal gegoogelt und da ist tatsächlich über Nacht eine neue Version, LeeDrOiD 2.5-final, released worden. Die liess sich dann ohne jegliches wipe, über die Vorversion drüberflashen.

Und? Startpunkt der ganzen Aktion war ja, daß ich auf dem desire die ipv6 privacy extensions aktivieren wollte, wie von heise beschrieben. Mit rooten allein ging das noch nicht, weil sysctl nicht zur Verfügung stand. Mit LeeDrOiD kommt eine busyBox  und sogar ein nano. Ziel erreichbar.
Dann ist OpenVpn eingebunden, was die Tür zu manchem Projekt öffnet. Das Teil kennt jetzt einen Automodus mit klickarmem Menü zu Navigieren, Telefon, Kontakte, Musik. Noch ein paar nützliche Programme sind direkt eingebunden. Last but not least habe ich jetzt knapp 100 MB freien Telefonspeicher (vorher selbst nach großem Aufräumen kaum 14MB), was wohl dem App2sd+ zu verdanken ist.

Kleine Nervensäge:
Nach Neustart empfängt das Desire SMS mit Zahlencode...
Lösung:
Im Menupunkt "Kurzmitteilungen" in Einstellungen>Anrufen>Kurznachricht "Cell-Broadcasting" aktivieren/deaktivieren
in Verbindung mit Neustart des Desire, also:

"Cell-Broadcasting" aktivieren > Neustart > "Cell-Broadcasting" deaktivieren > Neustart > "Cell-Broadcasting" aktivieren

Android kann IPv6, adb aber nicht

Thursday, March 3. 2011

I started to work on a little thing for Android and whenever I run it from eclipse the console messages:  "Warning: No DNS servers found". Google yields the advice to double check /etc/resolv.conf which looks all valid, works (and hasn't been changed for some time). But since I'm moving towards an "IPv6 first" - setup in my Lan resolv.conf has only IPv6-reachable entries. Which apparently works fine with allmost everything except the android development tools. I reintroduced an IPv4 entry and the messages were gone.  So while Android itself does IPv6 nicely, the devel tools (i.e. adb) do not.



Continue reading "Android kann IPv6, adb aber nicht "

Android k9-mail with a different Icon

Monday, February 21. 2011

My Android mobile (HTC desire) runs k9-mail, a dilligently updated, configurable, imap-capable application well prepared to handle lots of mail but struck with an esthetically challenged icon. The head of a robot dog featured in a british cult tv series from the sixties - let's say you either love it or hate it. Judging by the number of hits this article gets I'm not alone with my irritation.

The little pic caused many discussions and every now and then someone creates a more suitable alternative and dares to propose it to the development team, but apparently this is like chewing rocks

OK, so either you leave it as it is or you change it yourself. But it is not completly trivial to change the icon of an android app, simply using an ressource editor and paste another icon into the file won't do. This is because Android apps are signed and if you change them after the signing they stop running.

On the other hand: it's open source, isn't it? So, create a project folder and on the command line type:
git clone https://github.com/k9mail/k-9.git
That done we follow the steps of 'How to build K-9 Mail' and if you happen to have set up an Android-Development Environment already, it takes but minutes and you see k9 running in the emulator. Nice, now for the icons. 

Our friend, the lovely dog, lives in two places within the ressources, at  
k-9/res/drawable/icon.png and k-9/res/drawable-hdpi/icon.png respectively.
In both places we replace it (.png, 72x72) with an image of our choice and proceed to create a new k9mail.apk with eclipse's File/Export/Android/Export android Application.

Now don't try to install the freshly built and signed k9-mail over the existing one, cause it won't. The AppInstaller starts up, displays the loading-grphs for a moment but it soon stops with nothing but a laconic message: Not installed. Searching the logs on my android didn't make me any wiser as to what was happening. 

So I tried adb which was far more eloquent. Started it as root:
sudo su
cd /opt/android-sdk-linux_86/platform-tools
./adb kill-server
./adb start-server
./adb devices

and it outputs:
List of devices attached 
emulator-5554   device
HT03ZPL02277    device

I closed the emulator with a click to make sure adb doesn't get confused about where to install in the next step and then input at the command line:
 ./adb install -r /path/to/git/proj/k9/apk/k9mail.apk

and it tells me all I need to know about the nature of the problem:
304 KB/s (2591136 bytes in 8.312s)
        pkg: /data/local/tmp/k9mail.apk
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]

Doh! The original app was signed with a totally different keys than my own built all that signing serves to keep some bad guy to silently change an app - of course it wouldn't install. Somewhat incomfortable but I had to uninstall the original app in order to install my own built. Don't forget to backup your settings! 

Sort of breaking the dog on a wheel but it works and is a nice exercise, too. There is a con though: it probably breaks the updating so you'll need to check for new versions and build them manually. Alternative approaches do exist though I didn't try them.

Addendum re: k9 and documentation: it is rather sporadic and they are in search of people to help them writing it. But there is a Wiki a FAQ and a much needed explanation re: folder classes and how to use them

And another addendum, not that related to the above but I wanted to put the link somewhere: About installing Certificates

(Page 1 of 1, totaling 5 entries)