Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Convert msg files to mime

by TheBigAmbulance (Acolyte)
on Jun 28, 2011 at 15:54 UTC ( #911797=perlquestion: print w/replies, xml ) Need Help??

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; } }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://911797]
Approved by Corion
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2023-02-07 15:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I prefer not to run the latest version of Perl because:







    Results (40 votes). Check out past polls.

    Notices?