# Hilfe bei der optimierung eines Perl-Scriptes



## rethus (29. September 2006)

Hallo,

ich habe mir ein Perl-Script besorgt, das Email-Konten (MBOX in MAILDIR ) umwandelt.
 ganz gut, aber ich muss es optimieren, weil ich das für ehtliche Mailboxen machen muss (Serverumzug  )

Was ich jetzt noch machen möchte ist folgendes:



> Das Script liegt immer in /var/qmail/mailnames/
> Die zu konvertierenden MBOX-Dateien liegen in dem Verzeichnis des jeweiligen Benutzers - innerhalb eines verzeichnisses, das dem Emailnamen entspricht.
> 
> Also:
> ...



Also hier das Script:

```
#!/usr/local/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@qmail.org>
# kludged into this by Ivan Kohler <ivan@voicenet.com> 97-sep-17
use Cwd; 
$currentPath = cwd();
print "\n\n ####################################################";
print "\n\n ####              MBOX >>  Maildir               ###";
print "\n\n ####################################################";
print "\n\n Du befindest dich im Verzeichnis:\n\t$currentPath";

if(scalar(@ARGV) != 2) {
  die("Usage: mbox2maildir src dest\n");
}
$MAILDIR = pop;
$MAIL    = pop;

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($<);
#$dir = "$currentPath/$dir";

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 = "$currentPath/$MAILDIR";
print "\nDas zu Parsende Verzeichnis ist:\n\t $spoolname\n\n";

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

$MAIL ="$currentPath/$MAIL"; 
open(SPOOL, "<$MAIL")
  or die "Unable to open $MAIL\n";
$i = time;
#
#Parsen der Mbox-Datei
#
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}");
print "Not unlinking $MAIL\n";
print "\n\n ####################################################\n";
```


----------



## rethus (29. September 2006)

Rufe ich mein aktuelles Script mit folgendem Parameter auf, arst er wie gesagt nur das eine angegebene Verzeichnis:


> perl /var/qmail/mailnames/mbox2maildir /info/INBOX.Sent info/Maildir/


 ...also das Email-Konto info des Benutzers.

Versucht habe ich es jetzt schon mal so:


> for m in *; do perl /var/qmail/mailnames/mbox2maildir ${m} Maildir/.${m}; done


Aber das bringt das Problem mit sich, das er nicht in die unterverzeichnisse absteigt....

Vielleicht gibt es ja auch für die For-Schleife eine simple erweiterung, das er in die Unterverzeichnisse absteigt... das würde schon reichen.


----------

