Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Создание сообщения из файла .msg в Outook API


Автор: Cheklov 20.8.2007, 12:45
У меня есть файл формата Outlook Message .msg. Как с помощью Outlook Object Library API создать объект Outlook._MailItem.

Автор: shmarov 21.8.2008, 17:20
Бъюсь сейчас со схожей проблемой - есть файл .msg, нужно вытащить кто куда когда кому чего писал и какие приложил файлы. Если чего нарою с Outlook Object Library API - отпишу.

Автор: shmarov 22.8.2008, 12:59
В общем вот чего мне удалось в итоге накопать:

Код

Outlook.ApplicationClass _app = new Outlook.ApplicationClass();
Outlook.MailItem _mail = 
       (Outlook.MailItem)_app.CreateItemFromTemplate(@"C:\Untitled.msg", 
       _app.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox));


Нет правда пока 100% уверенности в том, что созданный элемент полностью соответствует исходному сообщению. Не балуют ребята нормальным описанием SDK в последнее время. Наверное как Apple решили дать возможность зарабатывать на издании книг) Нашел ссылку на pdf-описание этого VSTO, правда то что мне удалось найти оказалось не полным и соответственно бесполезным. 
Если интересно - книга называется так: Visual Studio Tools for Office Using C# with Word, Excel, Outlook, and InfoPath.

Проблема только в том что мои изыскания не особо-то упростили мне жизнь - при попытке считать адресата или body - выскакивает сообщение аутлука, которое предлагает подтвердить доступ к данным.

Автор: shmarov 25.8.2008, 16:29
Cheklov, если поможет, то есть такой вариант решения твоей задачи - разобрать .msg файл по секциям и сформировать на основании их новое письмо.

http://www.codeproject.com/KB/cs/decompilingchm.aspx разбора на секции .CHM файла. Этот же метод можно применить и для разбора .MSG. Либо можно самому написать обертку для API, используя http://www.codeguru.com/cpp/cpp/cpp_mfc/files/article.php/c13487__1/.

Код

using Storage = RelatedObjects.Storage;
...
Storage.IStorageWrapper iww = new Storage.IStorageWrapper(@"C:/untitled.msg");
foreach (Storage.IBaseStorageWrapper.FileObjects.FileObject fileObject in iww.foCollection)
{
    // Check to make sure we can READ stream of an individual file object
    if (fileObject.CanRead)
    {
        // тут идентифицируем секцию и её контент по ключам - весь список есть в спецификации файла .MSG
        string _key = fileObject.FileName.Substring(fileObject.FileName.Length - 8, 4);
        switch (_key)
        {
            case "0C1F": //Ключ для email отправителя
                byte[] _byte = new byte[fileObject.Length];
                fileObject.Read(_byte, 0, (int)fileObject.Length);
                string fileString = Encoding.Unicode.GetString(_byte);
                MessageBox.Show(fileString);
                break;
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)