#!/usr/bin/perl # # Nico Schottelius # Date: 22-Sep-2003 # Last Modified: 26-Sep-2003 # # some code stolen from mbox2maildir by Bruce Guenter , # which based on mbox2maildir by Russell Nelson # first this was a shellscript, now it's a perlscript require 'stat.pl'; use File::Find; # this is where all the mails goto MAILDIR_BASE=/home/user/nico/Maildir/nsmail for spool in $@; do i=0 MAILDIR=$MAILDIR_BASE/`basename $spool`-$i; MAIL=$spool mkdir -p $MAILDIR/{new,cur,tmp} if [ ! -d "$MAIL" -a -f "$MAIL" ]; then echo Settings: $MAILDIR - $MAIL echo mbox2maildir-test "$MAIL" "$MAILDIR" read -p "converted $spool" fi $i++; done sub error { print STDERR join("\n", @_), "\n"; exit(1); } sub usage { print STDERR "usage: nsmail2maildir \n"; exit(@_); } # check args &usage(1) if $#ARGV != 2; $mbox = $ARGV[0]; $ddir = $ARGV[1]; &error("can't open mbox '$mbox'") unless open(SPOOL, $mbox); -d $ddir || mkdir $ddir,0700 || &error("destinationdir '$mdir' doesn't exist and can't be created."); -d $ddir || mkdir $ddir,0700 || &error("destinationdir '$mdir' doesn't exist and can't be created."); chown($uid,$gid,$mdir) if defined($uid) && defined($gid); chdir($mdir) || &error("fatal: unable to chdir to $mdir."); -d "tmp" || mkdir("tmp",0700) || &error("unable to make tmp/ subdir"); -d "new" || mkdir("new",0700) || &error("unable to make new/ subdir"); -d "cur" || mkdir("cur",0700) || &error("unable to make cur/ subdir"); chown($uid,$gid,"tmp","new","cur") if defined($uid) && defined($gid); $stamp = time; sub open_msg { my($flags,$header) = @_; if($flags) { if($flags =~ /RO/) { $fn = "cur/$stamp.$$.mbox:2,S"; } elsif($flags =~ /O/) { $fn = "cur/$stamp.$$.mbox"; } else { $fn = "new/$stamp.$$.mbox"; } } else { $fn = "new/$stamp.$$.mbox"; } $stamp++; close(OUT); open(OUT, ">$fn") || &error("unable to create new message"); chown ($uid,$gid,$fn) if defined($uid) && defined($gid); print OUT @$header, "\n"; } $in_header = 0; while() { if(/^From /) { open_msg($flags, \@header) if $in_header; undef $flags; undef @header; $in_header = 1; push @header, "MBOX-Line: $_"; } elsif($in_header) { if(/^\s+$/o) { $in_header = 0; open_msg($flags, \@header); } else { $flags = $1 if /^Status:\s+(\S+)/oi; push @header, $_; } } else { s/^>From /From /; print OUT || &error("unable to write to new message"); } } close(SPOOL); open_msg($flags, \@header) if $in_header; close(OUT);