Com passar de "mailbox" a "maildir"

  • warning: tempnam(): open_basedir restriction in effect. File() is not within the allowed path(s): (/srv/www/gilug.org/www/site.tree/) in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 802.
  • warning: fopen(): Filename cannot be empty in /srv/www/gilug.org/www/site.tree/public/includes/file.inc on line 803.
  • El fitxer no s'ha pogut crear.

He de dir que portava temps intentant migrar de mailbox a maildir, ja que m'havia fet amb diversos scripts per fer-ho, i cap havia funcionat correctament.
Pels que siguin nouvinguts en el tema, el format mailbox no és res més que posar tot el correu dins un fitxer, i així cada vegada que mirem si hi ha correu i ens ho baixem -per exemple- amb fetchmail i ho tractem amb procmail, es va concatenant el correu que arriba, amb el que ja hi teniem. Això a la llarga pot suposar que tinguem un fitxer molt gran, i per alguns sistemes de fitxers pot ser lleugerament més lent de treballar-hi. És per això que en l'actualitat es fa servir majoritàriament el format maildir.
Per norma general, el fitxer de correu, també anomenat mailbox es troba a /var/spool/mail/$USER mentre que amb maildir el directori es sol trobar a $HOME/.maildir/

  1. L'script per fer la migració
    • Buscant per google vaig trobar un script a la web de qmail que en teoria havia de passar de mbox a maildir però no funcionava, l'he modificat i ara ja em funciona. Consisteix en un petit script escrit en Perl, que us poso a continuació:
      #!/usr/bin/perl
      #
      # mbox2maildir: coverts mbox file to maildir directory - the reverse of
      # maildir2mbox from the qmail distribution.
      #
      # Usage: mbox2maildir uses the same environment variables as maildir2mbox:
      # MAILDIR is the name of your maildir directory; MAIL is the name of your
      # mbox file; MAILTMP is ignored.  MAIL is deleted after the conversion.
      #
      # WARNING: there is no locking; don't run more than one of these!  you
      # have been warned.
      #
      # based on convert-and-create by Russell Nelson <nelson(arrova)qmail.org>
      # kludged into this by Ivan Kohler <ivan(arrova)voicenet.com> 97-sep-17
      # modified by Christian Peraferrer <corellian(arrova)users.sourceforge.net> 05-jan-7
      
      require 'stat.pl';
      
         local $SIG{HUP} = 'IGNORE';
         local $SIG{INT} = 'IGNORE';
         local $SIG{QUIT} = 'IGNORE';
         local $SIG{TERM} = 'IGNORE';
         local $SIG{TSTP} = 'IGNORE';
      
      ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) =
      getpwuid($<);
      
      die "fatal: home dir $dir doesn't exist\n" unless -e $dir;
      &Stat($dir);
      die "fatal: $name is $uid, but $dir is owned by $st_uid\n" if $uid != $st_uid;
      
      chdir($dir) or die "fatal: unable to chdir to $dir\n";
      $spoolname = "$ENV{MAILDIR}";
      -d $spoolname or mkdir $spoolname,0700
         or die("fatal: $spoolname doesn't exist and can't be created.\n");
      
      chdir($spoolname) or die("fatal: unable to chdir to $spoolname.\n");
      -d "tmp" or mkdir("tmp",0700) or die("fatal: unable to make tmp/ subdir\n");
      -d "new" or mkdir("new",0700) or die("fatal: unable to make new/ subdir\n");
      -d "cur" or mkdir("cur",0700) or die("fatal: unable to make cur/ subdir\n");
      
      open(SPOOL, "<$ENV{MAIL}")
         or die "Unable to open $ENV{$MAIL}\n";
      $i = time;
      while(<SPOOL>) {
         if (/^From/) {
            $fn = sprintf("new/%d.$$.mbox", $i);
            open(OUT, ">$fn") or die("fatal: unable to create new message");
            $i++;
            next;
         }
         s/^>From/From/;
         print OUT or die("fatal: unable to write to new message");
      }
      close(SPOOL);
      close(OUT);
      unlink("$ENV{MAIL}");

      Per fer-ho més senzill us podeu baixar l'script: mbox2maildir
      Recordeu que heu de donar permís d'execució al fitxer quan l'aneu a utilitzar:

      $ chmod +x mbox2maildir

      Un cop fet això, per executar l'script s'han de definir unes variables d'entorn, MAIL i MAILDIR, la primera és la ruta completa del fitxer mailbox (/var/spool/mail/$USER), i la segona del directori on anirà a parar el resultat de la conversió, en el nostre cas: $HOME/.maildir/. Per tant:

      $ export MAIL=/var/spool/mail/$USER
      $ export MAILDIR=$HOME/.maildir/

      i seguidament ja estarem preparats per executar l'script:

      $ ./mbox2maildir

Si tot ha anat bé, i no ha donat cap error, ja hauriem de tenir el correu que teniem en format mailbox al nostre $HOME/.maildir/ convertit en format maildir, i a punt per llegir-ho amb el vostre lector de correu preferit, com per exemple Mutt.

Qualsevol dubte o suggerencia, ho podeu deixar com a comentari. Ja que personalment vaig tenir un altre problema a l'hora de convertir-ho però que se surt de l'objectiu d'aquest article.

y al revés...

A mi me ocurrió hace no mucho que necesitaba el paso contrario, convertir una serie de directorios maildir a formato mbox, en concreto era para poder recuperar un monton de mails que tenía en una m@¡quina vieja en la que estaba usando Kmail, y que quería organizar con hypermail (muy útil), el cual solo admite ficheros mbox...

El script en cuestión lo encontré aquí