Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Unique Id From MailItem (Microsoft.Office.Interop.Outlook)?

I'm creating an application that is reading emails received in outlook.

The reading process is something like this:

using Outlook = Microsoft.Office.Interop.Outlook;

var app = new Outlook.Application();
var ns = app.GetNamespace("MAPI");
ns.Logon(null, null, false, false);

var inboxFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
var subfolder = inboxFolder.Folders["MyFolderName"];

foreach (Outlook.MailItem item in subfolder.Items)
{
    // do something
    // item.EntryID
}

I need to get an unique ID for every item in the foreach loop.

There is a EntryID property in Outlook.MailItem that I used and it was working well, but I found out there was a problem with that property: Whenever I moved the email to another folder (inside outlook), This property EntryID changed.

I ran several tests and discovered that the EntryID value changes only a few chars when I move the mail to another folder.

I need an ID that would be unique no matter what folder. Is there an another property from Outlook.MailItem or any substring of EntryID that is always unique?

I'm using:

  • .NET 4.0;
  • Outlook 2010;
  • Microsoft.Office.Interop.Outlook.dll version 14.0.0.0.
like image 201
Jonny Piazzi Avatar asked Apr 30 '13 21:04

Jonny Piazzi


2 Answers

There is no such property. You can create your own property using MailItem.PropertyAccessor or MailItem.UserProperties, but it will stop being unique if a message is copied to another folder as you will now have 2 items with the same id.

like image 125
Dmitry Streblechenko Avatar answered Nov 12 '22 17:11

Dmitry Streblechenko


Unique Id for MailItem can be obtained by combining few email properties that could unlikely be the same for any different emails e.g.

$"{item.SenderEmailAddress}-{item.SentOn.Ticks/TimeSpan.TicksPerSecond}-{item.Size}";

like image 24
Bohdan Avatar answered Nov 12 '22 18:11

Bohdan