in reply to is it possible to use Perl to process Outlook emails?

How does the email get stored respectively how are you supposed to get access to the email?

Personally, I like IMAP servers for storing and accessing email, as Perl has quite good IMAP support. But as you are talking about "Outlook" (which is a client side program), maybe you mean that the data is stored in a Microsoft Exchange Server?

If the data is in fact stored in Microsoft Exchange, the first approach I would take would be to see how Exchange can be accessed through IMAP (see above). If that fails, you can always look at how to automate Outlook (through Win32::OLE) or, better, to use MAPI or Simple MAPI for accessing the Microsoft Exchange Server.

  • Comment on Re: is it possible to use Perl to process Outlook emails?

Replies are listed 'Best First'.
Re^2: is it possible to use Perl to process Outlook emails?
by mertserger (Curate) on Jul 26, 2011 at 13:22 UTC

    The plan is for the data to arrive in an Outlook mailbox, in the normal work email system (which is an Exchange server). I have experimented with using the Outlook in-built export functionality to get the data into Access but the entire email body ends up as a single field.

    As they say I wouldn't have started here but that part of the system was agreed between the corporate IT department and the users before I got involved.

      Your exchnage sever may have POP3 mail box access set up. If it has it's fairly easy to get Mail::POP3Client to grab the mail. I've had to do this recently:
      #!c:\strawberry\perl\bin\perl.exe use Modern::Perl; use Mail::POP3Client; use MIME::QuotedPrint; my $pop_user = 'XXXXXXXXXX'; my $pop_pass = 'XXXXXXXXXX'; my $pop_host = 'exchange3'; #connect to POP3 sever my $pop = new Mail::POP3Client ( HOST => $pop_host ); $pop->User($pop_user); $pop->Pass($pop_pass); $pop->Connect() or die "Unable to connect to POP3 server: ".$pop->Message()."\n"; #count number of items in POP3 mailbox my $mailcount = $pop->Count(); for (my $i = 1; $i <= $mailcount ; $i++) { my $header = $pop->Head($i); #gets the header my $uni = $pop->Uidl($i); # gets the unquie id my $body = $pop->Body($i); $body = decode_qp($body); #decode quoted printable body say "$uni"; say "$header\n"; say "$body"; }
      Edit 27/07/2011@10:33BST Removed reference to subroutine not include in code &return_error and replaced with die
        I tried to run this routine. The error message was: "unable to connect to POP3 server: couldn't connect socket exchange3, 110; Invalid argument." Any advise will be appreciated. Thanks in advance.
      Well, if you want a really backwards way to do it ( which is how I do it! ), i do it like the following:
      1. Set up a complex rule in Outlook so that when a message arrives, the following sequence occurs:
      a) Outlook can start up a program for you in the rule, i use it to start my perl program, which waits for:
      b) Run the following VB script to save the email to a local file, which your perl script is polling
      Sub WriteEmailToFile(MyMail As MailItem) Dim myMailEntryID As String Dim myMailBody As String Dim outlookNameSpace As Outlook.NameSpace Dim outlookMail As Outlook.MailItem myMailEntryID = MyMail.EntryID Set outlookNameSpace = Application.GetNamespace("MAPI") Set outlookMail = outlookNameSpace.GetItemFromID(myMailEntryID) Set fileSystemObject = CreateObject("Scripting.FileSystemObject") / you can create a dynamic text file name is you want... Set textFile = fileSystemObject.CreateTextFile("c:\temp\OutlookEma +il.txt", True) textFile.WriteLine (outlookMail.SenderEmailAddress) textFile.WriteLine (outlookMail.SentOn) textFile.WriteLine (outlookMail.Subject) outlookMailBody = outlookMail.Body 'strip non-printing characters For x = 127 To 255 While InStr(outlookMailBody, Chr(x)) > 0 outlookMailBody = Replace(outlookMailBody, Chr(x), "") Wend Next x textFile.WriteLine (outlookMailBody) textFile.Close End Sub