Howto: Confixx Mailboxen zu Maildirs konvertieren.

Plesk, Confixx, Froxlor, SysCP, SeCoTo, IspCP, etc.
Post Reply
stifler
Posts: 22
Joined: 2003-09-03 15:10
Location: Kölbingen/Westerwald
Contact:
 

Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by stifler »

Da ich auf unseren Servern zu Courier-Imap migriert habe (nehmts mir nicht übel, aber ich mag Cyrus nicht) und es evtl. einige User gibt die diesen in Verbindung mit Confixx einsetzen steht man bei der Umstellung vor dem Problem, dass Confixx nach Ã?nderung der confixx_main.cf zwar brav neue POP-User mit Verzeichnis anlegt, aber die alten weiterhin im MBOX-Stil führt. Wenn man aber (u.a.) in Postfix den Transport auf Maildir umstellt geht das ganze in die Hose da diese User keine Maildir haben. Also ist man gezwungen die ganzen User von Hand anzulegen, was ab > 20 POP-Accounts zur Qual wird. Da mich das heute morgen auch anfing zu quälen hab ich kurzerhand mal was gebastelt, dass mir auf einen Rutsch alle Confixx-POP Accounts zu Maildir migriert.

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:
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.
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.

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"; 
}

?>
ggf. muss man bei der passthru() Funktion den Pfad zu chown und (wenn im anderen Verzeichnis) zu mbox2maildir.pl anpassen. Normalerweise nicht der Fall.

Dass Benutzer / Passwort zur Confixx-DB auch angepasst werden müssen ist denke selbstverständlich :wink:

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});
Wenn Ihr also beide Skripte in einem Verz. habt einfach mit php -q confixx-maildirconvert.php ausführen und es sollte ungefähr folgende Ausgabe erfolgen:

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 ...
Damit wäre das größte geschafft - MBOX'es wurden zu Maildir's konvertiert.

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
cfreak
Posts: 74
Joined: 2002-08-12 19:51
Location: Regensburg
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by cfreak »

0-antwort-löschung verhindern
adjustman
Posts: 1132
Joined: 2003-03-26 23:29
Location: SA
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by adjustman »

cfreak wrote:0-antwort-löschung verhindern
Noch kleiner gings wohl nicht? :wink:
wirsing
Posts: 604
Joined: 2002-11-20 21:32
Location: Vaihingen und Karlsruhe
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by wirsing »

Doch. Es geht kleiner.
adjustman
Posts: 1132
Joined: 2003-03-26 23:29
Location: SA
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by adjustman »

wirsing wrote:Doch. Es geht kleiner.
8) :-D
adjustman
Posts: 1132
Joined: 2003-03-26 23:29
Location: SA
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by adjustman »

stifler wrote: .. und natürlich muss ein Maildir fähiger IMAP/POP3-Daemon her, wie z.B. Courier-Imap den ich nutze ..
wie kriegt man denn raus, ob der pop3-daemon Maildir unterstützt?

Benutze qpopper
User avatar
Joe User
Project Manager
Project Manager
Posts: 11191
Joined: 2003-02-27 01:00
Location: Hamburg
Contact:
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by Joe User »

adjustMan wrote:
stifler wrote: .. und natürlich muss ein Maildir fähiger IMAP/POP3-Daemon her, wie z.B. Courier-Imap den ich nutze ..
wie kriegt man denn raus, ob der pop3-daemon Maildir unterstützt?
Durch lesen der Dokumentation?
adjustMan wrote:Benutze qpopper
qpopper unterstützt keine Maildirs.
adjustman
Posts: 1132
Joined: 2003-03-26 23:29
Location: SA
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by adjustman »

und was würdet ihr für nen Daemon empfehlen?

Debian Woody mit Postfix und Confixx :roll:
User avatar
Joe User
Project Manager
Project Manager
Posts: 11191
Joined: 2003-02-27 01:00
Location: Hamburg
Contact:
 

Re: Howto: Confixx Mailboxen zu Maildirs konvertieren.

Post by Joe User »

sofern als *.deb verfügbar: Postfix-TLS 2.0.16 + Courier-IMAP(-SSL) 2.1.1 (gegebenenfalls selbst kompilieren)
Post Reply