How to catch Message Move Event.

  • Thread starter Thread starter Ashutosh Jogdande
  • Start date Start date
A

Ashutosh Jogdande

Hi All,

Is there any way to Catch Message Move event through outlook addin, when
message/s are moved by using Email-rules or to Archive folders?

I am able to do this on manual message move by catching ItemRemove on
selected folder.
But while running a rule I am not getting Message Move/Remove event.

Code :
outlookExplorer.CurrentFolder.Items.ItemRemove += new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemRemoveEventHandler(Items_ItemRemove);


Thanks in advance,
Ashutosh
 
That would partially depend on what version of Outlook. For Outlook 2003 and
earlier you only would have the Items.ItemAdd() and ItemRemove() events on
the destination and source folders to rely on. In Outlook 2007 you have the
Folder.BeforeItemMove() event you could also try.
 
Hi Ken,

Thanks for quick reply.

By adding ItemRemove event handler on outlookExplorer.CurrentFolder I am
able to catch the event.

But How to add event handler for all folders when addin gets loaded, as we
want to catch events for the mails which are getting archived or Moved using
Email-Rules.

I have tried by adding event handler to all the folders on addin startup,
but it didn't work.

Is there any way to trap this event at Explorer level?

Here is the code :
IEnumerator enumrator = _outlookApplication.Session.Folders.GetEnumerator();
while (enumrator.MoveNext())
{
Outlook.Folder folder = (Outlook.Folder)enumrator.Current;
if (folder != null)
{
AddEventHandlers(folder);
}
}

where AddEventHandlers recursively adding event hadler to each folder.

Thanks,
Ashutosh
 
As you can see in the Object Browser there isn't an Explorer level event you
can use.

When I need to handle multiple folders, Explorers, Items collections,
Inspectors, etc. I set up a class to handle what I need, including all
events I want to handle. Then I maintain a set of those classes in a
collection/list/whatever to keep them alive.

For ItemRemove() and/or ItemAdd() I would do a recursive search of all
folders loaded that I was interested in and grab the Items collection for
each one, setting the Items collection object in my class to that Items
collection and putting it in my list. Then the events would fire
automatically. On shutdown I'd just unwind the list collection and null out
everything.

The code you show is non-recursive, it would only return top level folders
of the NameSpace object, which would be at the Outlook Today level (top of
store). If you have only one PST or mailbox loaded you'd get exactly 1
handler installed and it would likely be useless. I'd recursively call each
Session.Folders.Item() object and dig down into those also to get all the
folders and their Items collections.
 
Hi Ken,

Thanks for detailed reply,

I did the same, only thing I am missing is maintaining a Custom Class,
instead of that I have used Global List of Outlook.MAPIFolder.

And Recursion code is inside AddEventHandlers() Method.

But it's not working :(



Her is the code missing in my last post:

Global variable List<Outlook.MAPIFolder> folders;

void AddEventHandlers(Outlook.Folder folder)
{
folders.Add(folder);
logger.Debug("Adding ItemRemove eventhandler to " + folder.Name);
folder.Items.ItemRemove += new
Microsoft.Office.Interop.Outlook.ItemsEvents_ItemRemoveEventHandler(Items_ItemRemove);

IEnumerator enumrator = folder. Folders.GetEnumerator();
while (enumrator.MoveNext())
{
Outlook.Folder tempFolder = (Outlook.Folder)enumrator.Current;
if (tempFolder != null)
{
AddEventHandlers(tempFolder);
}
}
}
 
Thanks Dmitry,

Unfortunately we are not using redemption in this version :( .
We would possibly use in our next version...


Thanks,
Ashutosh
 
Hi Ken,

It started working after adding event handler on cached Folder.Items, Now
events are getting fired on message Move. :)

Only concern remaining is, how do I get Entry IDs of moved messages (old
entry id before message move)?

As I can't go for Folder.BeforeItemMove() which is available in Outlook
2007.

Thanks,
Ashutosh.
 
There is no way to get the EntryID of the items since ItemRemove() fires
after the item was removed and doesn't give you a handle to the removed
item. You'd have to maintain a list of items in each monitored folder with
their EntryID's and compare with the current Items collection to see what
was missing.

In addition, when an item is moved within a store the EntryID may change and
the old one would no longer be valid. That happens for example in a Exchange
mailbox store where it doesn't happen with a PST file store. Whether the
EntryID changes is entirely store provider dependent.
 
Hi Dmitry,

Can we trap Message Move event from one store to other store, using
redemption? (e.g. when messages are being archived).

Thanks,
Ashutosh.
 
Messages can only be truly moved within the same store. If you move messages
across different stores, messages are created in the target store and
deleted in the source store.

--
Dmitry Streblechenko (MVP)
http://www.dimastr.com/
OutlookSpy - Outlook, CDO
and MAPI Developer Tool
-
 
Back
Top