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 |