http://qs321.pair.com?node_id=911797

TheBigAmbulance has asked for the wisdom of the Perl Monks concerning the following question:

I have found the following perl script online to convert a msg file saved from Outlook into a mime file.

#!/usr/bin/perl -w use strict; use warnings; use Email::Outlook::Message; use Email::LocalDelivery; use Getopt::Long; use Pod::Usage; use File::Basename; use vars qw($VERSION); $VERSION = "0.903"; my $verbose = ''; my $mboxfile = ''; my $help = ''; GetOptions( 'mbox=s' => \$mboxfile, 'verbose' => \$verbose, 'help|?' => \$help) or pod2usage(2); pod2usage(1) if $help; defined $ARGV[0] or pod2usage(2); foreach my $file (@ARGV) { my $mail = new Email::Outlook::Message($file, $verbose)->to_email_mi +me->as_string; if ($mboxfile ne '') { Email::LocalDelivery->deliver($mail, $mboxfile); } else { my $basename = basename($file, qr/\.msg/i); my $outfile = "$basename.mime"; open OUT, ">:utf8", $outfile or die "Can't open $outfile for writing: $!"; print OUT $mail; close OUT; } }

It is working good, and a huge THANK YOU to the author. The reason I am posing here is that if I want to use this script, I need to initiate it by entering the following:

$ perl ./msg.pl *msg

What I am trying to accomplish is scan the entire directory for msg files, and parse them accordingly.

my @mimefiles = <*.mime>; foreach my $mimefile (@mimefiles) { foo.... }

As a novice perl programmer, could someone offer a suggestion at how I would go about accomplishing my goal of not having to enter the ' *msg'? Thank you for your time.

Replies are listed 'Best First'.
Re: Convert msg files to mime
by wind (Priest) on Jun 28, 2011 at 18:43 UTC

    Your problem is that the script is made to only accept literal file names instead of file globs?

    If so, just add a filter to the @ARGV loop to translate any globs into a list of files like you already demonstrated in your second bit of code:

    foreach my $file (map {/\*/ ? glob($_) : $_} @ARGV) {
Re: Convert msg files to mime
by ~~David~~ (Hermit) on Jun 28, 2011 at 18:27 UTC

    I think you could try something like this, depending on how you want to specify the directory:

    #!/usr/bin/perl -w use strict; use warnings; use Email::Outlook::Message; use Email::LocalDelivery; use Getopt::Long; use Pod::Usage; use File::Basename; use vars qw($VERSION); $VERSION = "0.903"; use File::Slurp; # exports read_dir sub my $verbose = ''; my $mboxfile = ''; my $help = ''; GetOptions( 'mbox=s' => \$mboxfile, 'verbose' => \$verbose, 'help|?' => \$help) or pod2usage(2); pod2usage(1) if $help; defined $ARGV[0] or pod2usage(2); my $dir = $ARGV[0]; # pass in directory instead of file foreach my $file ( read_dir( $dir ) ) { next unless $file =~ /\.msg/; # skip anything that is not a messag +e $file = $dir .'/' . $file; # Email::Outlook::Message, does it r +equire fully qualified path? my $mail = new Email::Outlook::Message($file, $verbose)->to_email_mi +me->as_string; if ($mboxfile ne '') { Email::LocalDelivery->deliver($mail, $mboxfile); } else { my $basename = basename($file, qr/\.msg/i); my $outfile = "$basename.mime"; open OUT, ">:utf8", $outfile or die "Can't open $outfile for writing: $!"; print OUT $mail; close OUT; } }