1

I'm trying to store some data in the user properties, then write the mail to a .msg file, and (later) reload the .msg file to read the user property.

The problem is: after reloading the file, I don't have any user property any more.

I'm using Outlook 2010 32 bit

Here is a piece of code that show the behaviour:

Outlook.MailItem originalItem = ((MailItemWrapper)this.Item)._item;

var path = System.IO.Path.GetTempFileName() + ".msg";
var propName = "ActionId123456789";

// Set a user property "ActionId" with value "test"
var ps = originalItem.UserProperties;
var p = ps.Find(propName);
if (p == null)
    p = ps.Add(propName, Outlook.OlUserPropertyType.olText, Type.Missing);
p.Value = "test";

// Save to a temp file
originalItem.Save(); // --> I also tried without this line
originalItem.SaveAs(path);

// Chech the the property is correctly set
p = originalItem.UserProperties[propName];
if (p != null)
    Console.WriteLine(p.Value); // ---> Show 'test'

// Open the temp file
Outlook.MailItem newItem = AddinModule.CurrentInstance.OutlookApp.Session.OpenSharedItem(path) as Outlook.MailItem;

// Check that the property still exists
p = newItem.UserProperties[propName];
if (p != null)
    Console.WriteLine(p.Value); // ---> Not executed: p is NULL !

Does someone know how to do this ?

Instead of using OpenSharedItem, I also tried opening the mail using Process.Start, but in this case the user property is also null ...

BTW this piece of code is a test sample, so it doesn't dispose properly all COM references.

SliverNinja - MSFT
  • 31,051
  • 11
  • 110
  • 173
Fabske
  • 2,106
  • 18
  • 33

2 Answers2

2

This forum post describes your issue exactly - User Properties are not persisting in MSG. I also experienced this same behavior which was changed by Microsoft back in 2007.

As a workaround, I just used a hidden Outlook folder to store my MailItem with the user properties instead of exporting it to disk and bringing it back in.

If this workaround isn't a possibility for you, you may need to work with EWS to store it in a shared mailbox and access the User Properties that way instead of exporting the MSG to disk.

Community
  • 1
  • 1
SliverNinja - MSFT
  • 31,051
  • 11
  • 110
  • 173
  • 1
    Thank you for your help. In the meantime I also found this link that given a description on what's happen: http://www.pcreview.co.uk/forums/saveas-sometimes-loses-userproperty-t2349355.html Unluckily both solutions you propose can't be possible as the msg file must be stored in a dedicated server. – Fabske May 21 '12 at 15:09
2

Ok I've found a solution that seems to works. For this, I need to use a 3rd party : Redemption.

The solution is to use a custom MAPI property, not the UserProperties collection. In the code below, "this._item" reference the Outlook.MailItem object you need to get/set the property

To do this, you need a Guid, always the same for your add-in

private const string customPropId = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";

To set the property

public void SetCustomProperty(string propertyName, string propertyValue)
{
    var sfe = new SafeMailItem() { Item = this._item };
    var propId = sfe.GetIDsFromNames(customPropId, propertyName);
    sfe.set_Fields(propId, propertyValue);
}

To get the property:

public string GetCustomProperty(string propertyName)
{
    var sfe = new SafeMailItem() { Item = this._item };
    var propId = sfe.GetIDsFromNames(customPropId, propertyName);

    var value = sfe.get_Fields(propId);
    if (value != null)
        return value.ToString();

    return null;
}

That's it

warning: I've not yet tested this code in a real situation, it only works in the same test case than the one posted in my question

Fabske
  • 2,106
  • 18
  • 33