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


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