Vorab: Ich habe das Konvertierungsscript in PHP geschrieben, natürlich wäre vielleicht Perl etwas sinnvoller, aber da ich a) Perl nicht besonders gut kann und b) ziemlich davon ausgehe, dass fast jeder ein PHP-CGI Interpreter unter /usr/bin/php schlummern hat dürfte es nicht so tragisch sein. Ausserdem hat Yoda schon gesagt, dass Perl dunkle Schattenseiten hat :lol:
So. Ich benötige also 2 Skripte: Eins was mir aus der Confixx Datenbank die POP-Accounts rausfischt und das andere was die MBOX zur Maildir migriert.Code! Yes. A programmer's strength flows from code maintainability. But beware of Perl. Terse syntax... more than one way to do it... default variables. The dark side of code maintainability are they. Easily they flow, quick to join you when code you write. If once you start down the dark path, forever will it dominate your destiny, consume you it will.
Ersteres ist selber geschrieben, zweiteres hab ich irgendwo gefunden. BTW: Das original mbox2maildir von qmail ist wesentlich spartanischer und nicht besonders gut im Fehler abfangen.
Hier also ersteres PHP-Skript. Dieses irgendwo von mir aus unter root mit
php -q confixx-maildirconvert.php
ausführen. Dieses benötigt das mbox2maildir.pl ! Also auch diese vorher im selben Verzeichnis anlegen und ausführbar machen!
Code: Select all
<?php
// Systemeinstellungen
$id = "confixx"; // Der user zur Confixx DB
$pw = "pwzumconfixxuser"; // Passwort zum MySQL Server
$host = "localhost"; // Host ("localhost" oder "IP-Adresse")
$database = "confixx"; // Name der Confixx Datenbank
$table = "pop3"; // Name der POP3-Tabelle
$mailhome = "/var/mailhome/"; // Da wo die POP-Dir's angelegt werden
$spooldir = "/var/spool/mail/"; // Da sollten die MBOX'es liegen
// Verbindung zum Server und Datenbank
$conn_id = mysql_connect($host,$id,$pw);
mysql_select_db($database,$conn_id);
echo "Erstelle Maildir's für POP3-Kontennn";
$query = "select account, uid from $table";
$result = mysql_query($query);
if (mysql_num_rows($result)) {
while($row=mysql_fetch_array($result)) {
$account = $row['account'];
$uid = $row['uid'];
echo "n$account mit UID $uid -- ";
if (is_dir($mailhome.$account)) {
echo("existiert bereits!n");
} else {
if (
(mkdir($mailhome.$account, 0750)) &&
(mkdir($mailhome.$account."/Maildir", 0750)) &&
(mkdir($mailhome.$account."/Maildir/cur", 0750)) &&
(mkdir($mailhome.$account."/Maildir/new", 0750)) &&
(mkdir($mailhome.$account."/Maildir/tmp", 0750))
) {
echo "angelegt, konvertiere mbox zu maildir ...n";
passthru("./mbox2maildir.pl -d -n $spooldir/$account $mailhome$account/Maildir");
echo("setze Berechtigungen fuer $account ...n");
passthru("chown $account:poponly $mailhome$account -R");
} else echo("Fehler beim anlegen!n");
}
}
} else {
echo "Keine POP-Konten in Datenbank gefunden!n";
}
?>Dass Benutzer / Passwort zur Confixx-DB auch angepasst werden müssen ist denke selbstverständlich
Dieses Skript hier konvertiert die existierenden MBOX'es in die Maildir's rein und wird von meinem confixx-helper-script benötigt! Es sollte mbox2maildir.pl genannt werden, ausführbar sein und im selben Pfad wie mein Script liegen.
Code: Select all
#!/usr/bin/perl -w
=pod
=head1 NAME
mbox2maildir - convert a BSD mbox file into a Maildir.
=head1 SYNOPSIS
maildir2mbox [B<-d>] [B<-n>] mbox maildir
=head1 DESCRIPTION
Converts a BSD mbox into a qmail style maildir.
=head1 OPTIONS
=over 4
=item B<-d>
Debug mode. Print what's going on to stderr.
=item B<-n>
If specified, the mail will appear as unread mail in the maildir. If
not, then the mail will be in the "read" state.
=back
=cut
use strict;
use vars qw($DEBUG);
$DEBUG = 0;
use Getopt::Std;
use Sys::Hostname;
sub usage {
my $me = $0;
$me =~ s!.*/!!;
die "usage: $me [-n] mbox maildirn";
}
#-----------------------------------------------------------------------
# This lot should really be in a module...
sub ismaildir ($) {
my $md = shift;
return (-d $md && -d "$md/cur" && -d "$md/new" && -d "$md/tmp");
}
# XXX Should use mkpath().
sub maildirmake ($) {
my $md = shift;
die "usage: maildirmake(dir)n"
unless $md;
my @dirs = ($md, "$md/cur", "$md/new", "$md/tmp");
umask 0077;
foreach my $d (@dirs) {
mkdir $d, 0755
or die "mkdir($d): $!n";
}
}
# Copy the contents of a mailbox into a maildir.
sub convert ($$;$) {
my ($mbox, $maildir, $new) = @_;
# Should the messages be flagged as newly arrived?
my $sub = $new ? "new" : "cur";
my $inf = $new ? "" : ":2,S";
die "usage: convert(mbox,maildir)n"
unless $mbox && $maildir;
die "not a file: $mboxn"
unless -f $mbox;
die "not a maildir: $maildirn"
unless ismaildir($maildir);
open(MBOX, $mbox)
or die "open($mbox): $!n";
my $now = time;
my $host = hostname;
my $i = 0;
my $fn;
while (<MBOX>) {
if (m/^From /) { # New message.
# See http://cr.yp.to/proto/maildir.html for details
$fn = "${maildir}/${sub}/${now}.$$_${i}.${host}${inf}";
$i++;
open(OUT, ">$fn")
or die "open($fn): $!n";
warn "creating $fnn"
if $DEBUG;
} else {
s/^>From /From /;
print OUT $_
or die "print($fn): $!n";
}
}
close OUT;
close MBOX;
}
#-----------------------------------------------------------------------
my %opt;
getopts("dn", %opt)
or usage;
$DEBUG = $opt{d};
usage
unless @ARGV == 2;
convert($ARGV[0], $ARGV[1], $opt{n});
Code: Select all
web2p15 mit UID 705 -- angelegt, konvertiere mbox zu maildir ...
creating /var/mailhome/web2p15/new/1064488673.31416_0.earth
creating /var/mailhome/web2p15/new/1064488673.31416_1.earth
creating /var/mailhome/web2p15/new/1064488673.31416_2.earth
setze Berechtigungen fuer web2p15 ...
web2p16 mit UID 706 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p16 ...
web2p17 mit UID 707 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p17 ...
web2p18 mit UID 708 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p18 ...
web2p19 mit UID 709 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p19 ...
web2p20 mit UID 710 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p20 ...
web2p21 mit UID 711 -- angelegt, konvertiere mbox zu maildir ...
creating /var/mailhome/web2p21/new/1064488674.31428_0.earth
setze Berechtigungen fuer web2p21 ...
web2p22 mit UID 714 -- angelegt, konvertiere mbox zu maildir ...
setze Berechtigungen fuer web2p22 ...
Natürlich muss noch die confixx_main.php abgeändert werden. Wie, das geht steht hier. Desweiteren bei Postfix der Transport auf Maildir umgestellt werden und natürlich muss ein Maildir fähiger IMAP/POP3-Daemon her, wie z.B. Courier-Imap den ich nutze.
Ihr könnt ja mal im Verzeichnis /var/mailhome (so heist's bei mir) in die einzelnen User-Folder reinschauen und dort unter Maildir/new sollten die Nachrichten aus den MBOX'es liegen. Desweiteren sollten die Berechtigungen auf webXpX:poponly stehen und die Rechte auf 750. Wenn dem so ist hat alles funktioniert und ihr habt erfolgreich auf Maildir umgestellt. :-D
so far
stif
