2014-10-20 4 views
0

я кодирование простого C# программы, которая пытается сохранить некоторые пользовательские свойства в Outlook, MailItem как метаданные ... Я создал этот простой метод для того, чтобы написать одно свойство:Сохранить пользовательское свойство в Outlook, MailItem постоянно

public static void AddCustomPropertyToEmail(Outlook.MailItem mail, string propKey, object propValue){ 
    if (propValue is System.Int32) { // INT 
    mail.UserProperties.Add(propKey, Outlook.OlUserPropertyType.olInteger,true, Outlook.OlFormatInteger.olFormatIntegerPlain); 
} 
    else if (propValue is System.Double){ // DOUBLE 
mail.UserProperties.Add(propKey,Outlook.OlUserPropertyType.olCurrency,true,Outlook.OlFormatCurrency.olFormatCurrencyDecimal); 
} 

    mail.UserProperties[propKey].Value = propValue; 
    mail.Save(); 
} 

и это для того, чтобы прочитать одно свойство:

public static string GetCustomPropertyFromEmail(Outlook.MailItem mail, string propKey){ 
    return (mail.UserProperties[propKey] != null) ? mail.UserProperties[propKey].Value.ToString() : null; 
} 

при печати на консоли каждое свойство, что я добавил перед печатью идет хорошо, только если я прочитал свойство из одного типа MailItem, хранящегося в память ... Например:

static void Main(string[] args){ 

    Outlook.Application outlookObj = new Outlook.Application(); 
    Outlook.MailItem m1 = GetCurrentEmailItem(outlookObj); 

    AddCustomPropertyToEmail(m1, “Int”, 100); 
    AddCustomPropertyToEmail(m1, “Double”, 2.0003); 

    Console.WriteLine(GetCustomPropertyFromEmail(m2, “Int”)); 
    Console.WriteLine(GetCustomPropertyFromEmail(m2, “Double”)); 

    if (m1 != null) Marshal.ReleaseComObject(m1); 
    Console.ReadKey(); 
} 

Эта программа отлично работает, печатает значения !!!

Но код последующий не происходит, она возвращает нуль в каждом случае:

static void Main(string[] args){ 

    Outlook.Application outlookObj = new Outlook.Application(); 
    Outlook.MailItem m1 = GetCurrentEmailItem(outlookObj); 

    AddCustomPropertyToEmail(m1, “Int”, 100); 
    AddCustomPropertyToEmail(m1, “Double”, 2.0003); 

    m1.SaveAs(@”C:\PWS\myMail.msg”, Outlook.OlSaveAsType.olMSG); 

    Outlook.MailItem m2 = (Outlook.MailItem)outlookObj.CreateItem(Outlook.OlItemType.olMailItem); 
    m2 = (Outlook.MailItem)outlookObj.Session.OpenSharedItem(@”C:\PWS\myMail.msg”); 

    // HERE THE PROGRAM PRINTS NULL 
    Console.WriteLine(GetCustomPropertyFromEmail(m2, “Int”)); 
    Console.WriteLine(GetCustomPropertyFromEmail(m2, “Double”)); 

    if (m2 != null) Marshal.ReleaseComObject(m2); 
    Console.ReadKey(); 
    } 

Мой вопрос: Как я могу сохранить/хранить пользовательские свойства в MailItem, и, возможно, сохранить соответствующий файл Сообщи в моем PWS и прочитать эти пользовательские свойства во второй раз ???

ответ

1

Вам необходимо позвонить в MailItem.Save, чтобы сохранить изменения.

+0

@ Dimitry- В конце функции AddCustomPropertyToEmail() я вызываю mail.Save(). Разве этого недостаточно? – atomicBee

+0

Этого должно быть достаточно. Проверьте с помощью OutlookSpy (щелкните OpenIMsgOnIStg), что файл MSG действительно имеет ваши настраиваемые свойства. Кроме того, UserProperties.Add возвращает объект UserProperty. Нет причин добавлять его сначала (игнорируя результат), затем снова обращайтесь к нему с помощью mail.UserProperties []. –

+0

@ Dimitry- Когда я смотрю на пользовательские свойства в Проводнике Windows, нет предметов! Кажется, что метод UserProperties.Add() сохраняет пользовательские свойства только внутри MailItem, которые находятся в папке «Входящие». Сохранение формата MailItem в формате .msg не позволяет хранить эту информацию внутри файла. – atomicBee

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