2012-05-18 2 views
1

Я пытаюсь сохранить некоторые данные в свойствах пользователя, а затем написать почту в файл .msg и (позже) перезагрузить файл .msg, чтобы прочитать свойство пользователя.Outlook OpenSharedItem теряет свойства пользователя

Проблема заключается в следующем: после перезагрузки файла у меня больше нет пользовательского свойства.

Я использую Outlook 2010 32 бит

Вот кусок кода, который показывает поведение:

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 ! 

Кто-то знает, как это сделать?

Вместо использования OpenSharedItem, я также попытался открытия почты с помощью Process.Start, но в этом случае свойство пользователя также нулевой ...

BTW этот кусок кода является тестовый образец, поэтому он не dispose правильно все ссылки COM.

ответ

2

Хорошо, я нашел решение, которое, кажется, работает. Для этого мне нужно использовать стороннего участника: Redemption.

Решение заключается в использовании собственного свойства MAPI, а не коллекции UserProperties. В приведенном ниже коде «this._item» ссылки на объект Outlook.MailItem вам нужно получить/установить свойство

Чтобы сделать это, вам нужно Guid, всегда же для дополнения в

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

Чтобы установить свойство

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); 
} 

Чтобы получить свойство:

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; 
} 

Вот именно

предупреждения: Я еще не тестировал этот код в реальной ситуации, он работает только в том же тесте, чем тот, публикуемом в моем вопросе

2

This forum post описывает вашу проблему точно - Пользовательские свойства не сохраняются в MSG. Я также испытал такое же поведение, которое было changed by Microsoft back in 2007.

В качестве обходного пути, я просто использовал hidden Outlook folder для хранения моих MailItem с пользовательскими свойствами, а не экспортировать его на диск и вернуть его в.

Если этот способ не возможность для вас, вы можете необходимо указать work with EWS to store it in a shared mailbox и получить доступ к свойствам пользователя, а не экспортировать MSG на диск.

+1

Благодарим за помощь. Тем временем я также нашел эту ссылку, которая дала описание того, что происходит: http://www.pcreview.co.uk/forums/saveas-sometimes-loses-userproperty-t2349355.html К несчастью, оба решения, которые вы предлагаете, не могут возможно, поскольку файл msg должен храниться на выделенном сервере. – Fabske

0

Если вы используете C++ или Delphi, вы могли бы используйте метод OpenIMsgOnIStg и непосредственно откройте файл MSG.

Вы также можете использовать Redemption и его RDOSession .GetMessageFromMsgFile - он открывает файл MSG и позволяет читать все его пользовательские свойства.

Смежные вопросы