Description: Recently, I have had the pleasure of getting knee deep into various aspects of Email. One of the things that I consistantly found myself wanting to do was to parse through it. I know the best way to do this is to connect to the IMAP server and download the messages. The best way I have come accross on how to accomplish this task is using Mail::IMAPClient.
CPAN: Mail::IMAPClient
Example 1:
Creating a connection to an IMAP server isn’t complicated. And once you are connected there are many things that you can do to manipulate messages. In this first example, I am merely going to show you how to connect to the mail server and download ALL the messages in specific folders:
# Always be safe use strict; use warnings; # Use the module use Mail::IMAPClient; $imap = Mail::IMAPClient->new( Server => 'mail.server.com:143', User => 'me', Password => 'mypass') # module uses eval, so we use $@ instead of $! or die "IMAP Failure: $@"; foreach my $box qw( HAM SPAM ) { # Which file are the messages going into my $file = "mail/$box"; # Select the mailbox to get messages from $imap->select($box) or die "IMAP Select Error: $!"; # Store each message as an array element my @msgs = $imap->search('ALL') or die "Couldn't get all messages\n"; # Loop over the messages and store in file foreach my $msg (@msgs) { # Pipe msgs through 'formail' so they are stored properly open my $pipe, "| formail >> $file" or die("Formail Open Pipe Error: $!"); # Send msg through file pipe $imap->message_to_file($pipe, $msg); # Close the messgae pipe close $pipe or die("Formail Close Pipe Error: $!"); } # Close the folder $imap->close($box); } # We're all done with IMAP here $imap->logout();
Example 2:
In this next example, we are going to take advantage of some other methods that are provided by this useful little module. We will begin by using the same base as is in Example 1, but we will add some nuances in the middle for functionality.
Note: Messages don’t get immediately deleted with IMAP, only marked for deletion. They aren’t actually deleted until the box is expunged. In this case, it gets done after the looping over each mailbox is complete. This is to say that if the program gets interrupted in the middle that the messages won’t be deleted until the mailbox is officially issued an expunge command.
# Always be safe use strict; use warnings; # Use the module use Mail::IMAPClient; $imap = Mail::IMAPClient->new( Server => 'mail.server.com:143', User => 'me', Password => 'mypass') # module uses eval, so we use $@ instead of $! or die "IMAP Failure: $@"; foreach my $box qw( HAM SPAM ) { # How many msgs are we going to process print "There are ". $imap->message_count($box). " messages in the $box folder.\n"; # Which file are the messages going into my $file = "mail/$box"; # Select the mailbox to get messages from $imap->select($box) or die "IMAP Select Error: $!"; # Store each message as an array element my @msgs = $imap->search('ALL') or die "Couldn't get all messages\n"; # Loop over the messages and store in file foreach my $msg (@msgs) { # Pipe msgs through 'formail' so they are stored properly open my $pipe, "| formail >> $file" or die("Formail Open Pipe Error: $!"); # Skip the msg if its over 100k if ($imap->size($msg) > 100000) { $imap->delete_message($msg); next; } # Send msg through file pipe $imap->message_to_file($pipe, $msg); # Close the messgae pipe close $pipe or die("Formail Close Pipe Error: $!"); # Delete each message after downloading $imap->delete_message($msg); # If we are just testing and want to leave # leave the messages untouched, then we # can use the following line of code # $imap->deny_seeing($msg); } # Expunge and close the folder $imap->expunge($box); $imap->close($box); } # We're all done with IMAP here $imap->logout();