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

Greetings, I have been able to establish a MAPI connection to my exchange server and am able to scan through unread messages and access the subject and body, but I am hoping someone can help me with a few things. The code is below and any help is greatly appreciated.

1. Is there a way to filter on the subject without reading using a filter like he one I am using to check only unread messages?
2. How do I mark th message read once I am done with it?
3. How do I move it into another folder.
for (my $msg = $messages->GetFirst(); $msg; $msg = $messages->GetN +ext()) { if($msg->ConversationTopic =~ /^MSS Security Incident Report / +){ print "Subject => " . $msg->ConversationTopic . "\n"; print "Body: ". $msg->Text."\n"; ##Want to move message to another folder here## ##Want to mark the message read here## } }
  • Comment on How do I move mail msg to another folder in ECHANGE via a MAPI connection?
  • Download Code

Replies are listed 'Best First'.
Re: How do I move mail msg to another folder in ECHANGE via a MAPI connection?
by Anonymous Monk on Feb 06, 2009 at 15:02 UTC
    Are we supposed to guess what module you're using?
      My bad, I am using Win32:OLE, full script is below.
      #Option Explicit use strict; use warnings; use Win32::OLE qw(EVENTS); &application_newmail('<EXCHANGESERVER>', '<USERNAME>'); # sub application_newmail { my ($server, $alias) = @_; # connect to mailbox of CN $alias us +ing server $server my $mapikey = "$server\n$alias"; my $err; my $session = Win32::OLE->new(qw(MAPI.Session)) or die Win32::OLE- +>LastError(); # Try to logon with dynamic profile under current account. # This may need a reasonable current CDO on your machine. my $mapi = $session->Logon(undef,undef,undef,1,undef,undef,$mapike +y); return $err if $err = Win32::OLE->LastError(); # can be problematic. Therefore we iterate with GetFirst/GetNext ( +see below) # 'Check Inbox for messages and exit of none found my $messages = $session->Inbox->Messages() or return Win32::OLE->L +astError(); my $filter = $messages->Filter() or return Win32::OLE->LastError() +; $filter->{Unread} = 1; # Only unread messages $messages->Sort(); # default Sort is ASC on CdoPR_MESSAGE_DELIV +ERY_TIME return $err if $err = Win32::OLE->LastError(); # Gather Subject and Body for (my $msg = $messages->GetFirst(); $msg; $msg = $messages->GetN +ext()) { if($msg->ConversationTopic =~ /^Test Subject Text /){ print "Subject => " . $msg->ConversationTopic . "\n"; print "Body: ". $msg->Text."\n"; } # Next Item } $session->Logoff(); } # end sub
      Net::IMAP::Client says
      # copy messages between folders $imap->select('INBOX'); $imap->copy(\@msg_ids, 'Archive'); # delete messages ("Move to Trash") $imap->copy(\@msg_ids, 'Trash'); $imap->add_flags(\@msg_ids, '\\Deleted'); $imap->expunge;
      IMAP has no built in move command, when you move a message you actually copy it to another folder and then delete the original (mark as deleted, expunge).

        Although what you've said is correct I suspect it is irrelevant to the poster - since MAPI is different from IMAP.

        When it comes to processing IMAP folders, moving, copying, and scripting I put together a simple perl tool which does the job. It might be useful to some.

        Steve
        --
        Thanks, but I am using MAPI