Skip to content

Instantly share code, notes, and snippets.

@hryk
Created May 17, 2012 08:55
Show Gist options
  • Select an option

  • Save hryk/2717521 to your computer and use it in GitHub Desktop.

Select an option

Save hryk/2717521 to your computer and use it in GitHub Desktop.

splitmbox.pl

2012-05-17T17:58:30

google-email-uploader-mac を使ってThunderbirdのInboxをアップロードしようとしたら、mboxが大きすぎてうまくいかなかったから作った。 Mail::Box::Managerはmbox開く時にロックしたりしていて、特に大きいmboxを開くとものすごく時間がかかるけど一応うまく動いた。

#!/usr/bin/env perl
use strict;
use warnings;
use Module::Load;
use Getopt::Long;
use Pod::Usage;
use Data::Dumper;
use File::Spec;
use POSIX;
eval {
load File::Path, 'make_path';
load Mail::Box::Manager;
1;
} or die "You need to install dependencies.";
sub split_mbox {
my $opts = shift;
my ($in_vol, $in_dir, $in_file) = File::Spec->splitpath($opts->{input});
my ($out_vol, $out_dir, $out_file) = File::Spec->splitpath($opts->{output});
print "Opening Inbox ... ";
# Open input mbox
my $input_mgr = Mail::Box::Manager->new(folderdir => $in_dir);
my $input_mbox = $input_mgr->open(folder => $opts->{input});
print "OK\n";
# Open output mbox
make_path($opts->{output}) unless (-d $opts->{output});
my $prefix = 0;
my $basename = 'Inbox';
my $num_msgs = $input_mbox->messages('ALL');
my $num_outputs = ceil($num_msgs/$opts->{split});
my $output_mgr = Mail::Box::Manager->new(folderdir => $out_dir);
my $output_mbox = $output_mgr->open(
folder => File::Spec->catfile($opts->{output}, "${basename}_${prefix}"),
access => 'rw', create => 1);
# Read and copy
my $cnt = 0;
print <<EOF;
Mail in $in_file:\t$num_msgs
Split into $$opts{split} mboxes
Messages per output mbox:\t$num_outputs\n
EOF
for my $msg ($input_mbox->messages('ALL')) {
if ($output_mbox->messages('ALL') > $num_outputs) {
print "Copy $cnt messages\n";
$output_mbox->close();
$prefix++;
$output_mbox = $output_mgr->open(
folder => File::Spec->catfile($opts->{output},"${basename}_${prefix}"),
access => 'rw', create => 1);
}
$msg->copyTo($output_mbox);
$cnt++;
}
$input_mbox->close();
}
sub main {
my $opts = {
help => 0,
split => 2,
output => './mbox/'
};
GetOptions(
'help|?' => \$opts->{help},
'split=i' => \$opts->{split},
'output=s' => \$opts->{output},
) or pod2usage(2);
pod2usage(1) if $opts->{help};
$opts->{input} = $ARGV[0];
die pod2usage(1) unless (defined $opts->{input});
unless (File::Spec->file_name_is_absolute($opts->{output})) {
$opts->{output} = File::Spec->rel2abs($opts->{output});
}
split_mbox($opts);
};
main();
__END__
=head1 NAME
splitmbox.pl
=head1 SYNOPSIS
./splitmbox.pl --split 5 --output ./mbox LargeInBox.mbox
=head1 OPTIONS
=over 5
=item split
The number of output mbox file.
=item output
Specify output directory. default is './mbox'
=item help
Show usage.
=back
=head1 DESCRIPTIONS
splitmbox.pl split large mbox file into specified part of files.
=head1 DEPENDENCIES
=head1 AUTHOR
1VQ9 <hello at 1vq9.com>
=head1 LICENSE
Copyrights 2012 by 1VQ9
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://www.perl.com/perl/misc/Artistic.html
=cut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment