Since Mark Crispin left the UW, development on the UW-IMAP toolkit paused. Mark however continued developing the toolkit under the name Panda-IMAP.

Panda-IMAP is not publicly available. Mark Crispin allows access to it to people (and organizations) that donate to the development of the project. Since I am a dedicated user of the UW-IMAP toolkit and time had passed since the last version of the “old” UW-IMAP toolkit (back in 2008) on April 23, 2010 I personally donated $100 to the project. Replacing UW-IMAP with Panda-IMAP was a piece of cake and given that we are planning to move to mix format mailboxes, I am extremely happy with the result of using Panda-IMAP so far.

ΥΓ: Ερώτημα για όσους υπερασπίζονται το άστοχο tweet της κυρίας Άννας Διαμαντοπούλου: Τα παραπάνω σημαίνουν πως το κόστος του mail server είναι $100, ή όποιο άλλο ποσό αποφάσιζα να δώσω από την τσέπη μου;

In the past I have described using Net::POP3 (combined with tmail from UW-IMAP and a Perl script) to move inboxes from an old (and proprietary) mail server to a new one. However, if your users keep folders like Sent, Drafts and Trash on the mail server, you have to move these also. And this is where Net::IMAP::Simple enters the picture:


use Net::IMAP::Simple;
use Sys::Syslog;

$host = shift or die;
$user = shift or die;
$pass = shift or die;

openlog("imapcat-tmail", 'pid', 'mail') or die;
syslog('info', 'fetching mail for user %s', $user);

# When debugging experiment only on myself
## if ($user ne "yiorgos") { exit 0; }

# Folders that we migrate.  CAUTION:  The Trash folder has to be the last in
# line!  That is because $imap->quit expunges the last open folder.  We want 
# this to be Trash and no other.

# For the time being, INBOX is being carried over by pop3cat-tmail.
## push @folder_list, "INBOX";
push @folder_list, "Sent";
push @folder_list, "Drafts";
push @folder_list, "Trash";

$imap = new Net::IMAP::Simple($host) or die;
$imap->login($user, $pass) or die;

while ($folder = shift(@folder_list)) {
        $nm = $imap->select($folder);
        next unless $nm;
        for ($i = 1; $i < = $nm; $i++) {
                $msg = $imap->get($i);
                open T, "| /storage/bin/tmail2 -I $folder $user";
                print T for @{$msg};
                close T;


## print "Bye.\n";
exit 0;

Some notes:

  1. tmail2 is a local version of tmail with a local quota function implemented in tquota.c. It also allows for the -I switch to be used by ordinary users.
  2. This script should be used with caution. When using it to move mailboxes around, keep in mind that all messages will be marked as new when moved.
  3. I must find time to do the same thing forking a version of mailutil that accepts the user password via a command line switch instead of the terminal.



Όλα τα χρόνια που κάνω αυτή τη δουλειά ποτέ δεν ήμουν οπαδός των quotas. Το όριο χρήσης ενός πόρου, όσο κι αν προκύπτει από μετρήσεις ή εκτιμήσεις δεν παύει στην πραγματικότητα να είναι αυθαίρετο. Κι ας υπάρχει αντικειμενικός λόγος που το θέτει εν ισχύ κάποιος: Η συνολική προστασία του συστήματος και η εξασφάλιση της συνέχισης της λειτουργίας του. Το όριο είναι αυθαίρετο γιατί υπάρχει πάντα εκείνος ο χρήσης που είναι λίγο πάνω από αυτό και με καλό λόγο.

Αν υποθέσουμε πως κάποιος έχει όριο στο home directory του τα 200MB, όταν αυτά ξεπεραστούν για 10 bytes (ή και λιγότερα ακόμα), πως μπορεί να ξέρει το σύστημα εάν αυτό συμβαίνει επειδή αποθηκεύει ο χρήστης ένα paper σημαντικό για την εργασία του ή ένα MP3; Απάντηση: Το σύστημα δεν μπορεί να ξέρει. Άσε που για το χρήστη το MP3 μπορεί να είναι και ισοδύναμα σημαντικό. Το σύστημα ξέρει μόνο νούμερα. Έχεις μέχρι N-bytes. Στα N+1… tough luck.

Για αυτό ποτέ στις δουλειές μου μέχρι τώρα δεν υλοποίησα ένα τέτοιο σύστημα. Όσο ισχυρά κι αν διατυπώθηκε η απαίτηση. Κι ας είναι οι χρήστες σαν ιδανικά αέρια. Γιατί αυτά τα 10 bytes παραπάνω μπορεί να είναι σημαντικά. Και γιατί για αυτά τα 10bytes (ενώ υπάρχει χώρος) ο χρήστης μπορεί να κάνει κατεργαριές που να προκαλέσουν βλάβη στο σύστημα. Ενώ αυτός το μόνο που θέλει, είναι να κάνει τη δουλειά του. Το έχω δει. Αντίθετα, στα “δικά μου συστήματα” εάν κάποιος έπαιρνε είδηση πως παρόλο που υπάρχουν δεδηλωμένα quota limits, αυτά ήταν μόνο “στα χαρτιά” και εκμεταλλευόταν το γεγονός, μια παράκληση του τύπου “Κάντε ένα clean-up γιατί διαφορετικά θα πρέπει να τα υλοποιήσω για όλους” αρκούσε.

Οι καιροί όμως αλλάζουν. Και μπορεί οι ISPs να μη δίνουν (όλοι) IMAP, αλλά δίνουν webmail access. Το Gmail αλλάζει τον τρόπο με τον οποίο αντιμετωπίζουν οι χρήστες την αλληλογραφία τους, ανεξάρτητα από τον mail provider. Και όλο και πιο πολλοί χρήστες “γλυκαίνονται” και επιλέγουν το “leave messages on server” στον POP3 client τους. Έτσι και το (μαθηματικό) μοντέλο αλλάζει. Ο mail (POP3) server δεν είναι πλέον ο ενδιάμεσος σταθμός. Είναι ο τελικός. Και αυτό τα αλλάζει όλα. Αυτά το +10 bytes γίνονται ξαφνικά πολύ σημαντικά, γιατί η υπέρβασή του ορίου δεν είναι στιγμιαία ή παροδική. Είναι μόνιμη.

Έτσι την προηγούμενη εβδομάδα για πρώτη φορά (ελπίζω και τελευταία) και με βαριά καρδιά, έκανα strong enforcement. Ελπίζω προσωρινά.

Τώρα αν μπορούσα να απαλλαγώ και από τα υπόλοιπα καθήκοντά μου ώστε να γράψω drivers για να παίζει το IMAP toolkit πάνω από κάτι σαν το HDFS…

Years ago we were faced with the following situation: We had thousands of mailboxes that were being served by a proprietary and unsupported version of email software. So we decided to move to a new architecture. While researching I selected a very good (IMHO) commercial product. But for reasons outside the scope of the post I opted for a F/OSS solution, and specifically the UW-IMAP toolkit. For those rushing to judge that price was the decisive factor I only have to reiterate Vladimir Butenko‘s words:

“Bottom line: you always pay. You need a simple thing – you pay a small amount, you need a big thing – you pay more.” (plain message and comp.mail.imap thread)

OK and now for the real question: How do you move thousands of mailboxes without your users noticing?

Since you do not know (and do not want to know) your users’ passwords the only thing you can do is to hack into the source code of your POP3 server (we do not offer IMAP yet). Whether it is the UW-IMAP toolkit, Cucipop, popa3d or any other server that you have access to its source, the server knows the correct password for your users when they authenticate. So when the authentication succeeds you fork(2) a program that logs into the old server and fetches the mailbox from the old server to the new one that runs the F/OSS software that you have selected. This can be fetchmail or any similar program. However I have found out that Net::POP3 is a better choice:

use Sys::Syslog;
use Net::POP3;
use DB_File;
$host = shift or die;
$user = shift or die;
$pass = shift or die;
tie %d, 'DB_File', "/etc/pop3.users.db", O_CREAT|O_RDWR, 0640, $DB_BTREE or die;
if ($d{$user}) {
        untie %d;
        exit 0;
$pop = Net::POP3->new($host) or die;
if ($pop->login($user, $pass) >= 0) {
        openlog("pop3cat-tmail", 'pid', 'mail') or die;
        syslog('info', 'fetching mail for user %s', $user);
        $msgnums = $pop->list or die;
        foreach $msgnum (keys %$msgnums) {
                $msg = $pop->get($msgnum);
                open T, "| /usr/bin/tmail $user" or die;
                print T @$msg;
                close T;
        $d{$user} = "OK";
        untie %d;
exit 0;

Where exactly in the server code you fork(2), exec(3) and wait(2) for the script depends on the source code. You need to find where in the server code the authentication procedure succeeds and patch from there, before the server actually opens the user’s mailbox.

This script basically checks whether it has already moved a user’s mailbox from the old server. If it has, then the user is found in /etc/pop3.users.db and the script exits. If not, then the mailbox is moved and the user is inserted in /etc/pop3.users.db. Simply using Net::POP3 allows you to move the old mailbox to the Unix traditional mailbox format. That is why we fork tmail, since I have chosen the mbx mailbox format to store messages (I compile UW-IMAP with CREATEPROTO=mbxproto). If your server supports a format like Maildir, then you have to customize the above script accordingly, since it is written for mbx, which means that the user’s mailbox is a single file.

Mulberry is back!


Κάποτε ήταν ο μόνος λόγος για να χρησιμοποιώ Windows:

Hi folks,
Finally, after much effort, I have regained the rights to Mulberry and am making it available for free as of today. See:


Some things to note:

1) It is free to anyone – no registration codes needed.

2) A new v4.0.5 version is available on the website. This simply removes the registration requirement and updates copyright notices etc.

3) There is no formal support for the product as there was before. Instead ‘community’ support via mailing lists and other resources will be used. I will make a best effort to respond in a timely fashion to issues, but see note (4) below.

4) This effort is purely a personal one on my part – all the work I do on this is being done in my (limited) spare time.

5) It is free but not open source. That’s an issue that we can discuss moving forward…

6) Also, major new features/revisions etc are out of the question right now (though I have a few pet projects that were being worked on before and which I will likely continue). Fixes to existing problems will be done as time allows. Hopefully if we find a way of dealing with issue (5) that may change – but that’s really going to depend on the level of interest from people willing to commit their own time to this as opposed to one of the other open source equivalents.

Hopefully those of you still using Mulberry and hoping to continue to do so for a while at least will find this good news.

Cyrus Daboo

Ίσως ο καλύτερος IMAP client που υπάρχει.-