Преобразование EML в MSG завершается неудачно при использовании IStorage

Я пытаюсь конвертировать EML в MSG файл. Я создаю IMessage объекта mapi на объекте IStorage; Назначьте идентификатор класса CLSID_Message для объекта IStorage; Разобрать файл EML, прочитать свойства и присвоить их объекту mapi IMessage; Вызывается Сохранить () на объекте IMessage mapi; Вызывается Commit() для объекта IStorage; Сгенерированный файл MSG не был доступен для чтения в Outlook. Поэтому я попробовал другой метод, как описано ниже.

Создан 2-й объект IMessage на IStorage; Вызывается IMessage::CopyTo() для 1-го объекта IMessage, чтобы передать данные во 2-е IMessage, размещенное на объекте IStorage; Сгенерированный файл MSG снова не читается OutLook.

Если я создаю объект IMessage внутри PST, то сгенерированный файл MSG доступен для чтения OutLook. Я думаю, что-то происходит, когда я создаю IMessage на IStorage. Я могу прочитать PR_SUBJECT из объекта IMessage, поэтому EML->MAPI преобразование произошло (этот код работал в течение многих лет).

Вот код

void EmlToMapiTest()
{
    const wchar_t* msgFileName = L"C:\\M1.msg";
    const wchar_t* emlFileName = L"C:\\E1.eml";
    IStorage*  pIStorage = 0;
    IMessage*  pIMessage = 0;
    DWORD gfMode = STGM_CREATE | STGM_TRANSACTED | STGM_READWRITE;
    STGOPTIONS sOptions = {0}; 
    sOptions.usVersion = 1;
    sOptions.ulSectorSize = 4096;
    IMalloc* lpMalloc = MAPIGetDefaultMalloc();
    HRESULT hr = ::StgCreateStorageEx(msgFileName,
    gfMode, STGFMT_DOCFILE, 0, &sOptions, 0, IID_IStorage,
    (void**)&pIStorage); 

    WriteClassStg(pIStorage, CLSID_IMessage);

    hr = OpenIMsgOnIStg(NULL ,
                Mapi::MAPIAllocateBuffer,
                Mapi::MAPIAllocateMore,
                Mapi::MAPIFreeBuffer,
                lpMalloc,
                NULL,
                pIStorage,
                NULL, 0, MAPI_UNICODE, &pIMessage);

    _bstr_t bstrEMlFile = emlFileName;
    DoConvert(bstrEMlFile,pIMessage); //Our own Mime <-> Mapi library

    pIMessage->SaveChanges(KEEP_OPEN_READWRITE);
    pIStorage->Commit(STGC_DEFAULT);

    pIMessage->Release();
    pIStorage->Release();
}

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

Спасибо

1 ответ

Решение

Попробуйте открыть файл MSG в OutlookSpy - нажмите кнопку OpenIMsgOnIStg. Отсутствуют ли какие-либо свойства по сравнению с хорошим сообщением?

Вы пытались использовать IConverterSession для выполнения преобразования?

Какая ошибка отображается в Outlook? Вы устанавливаете свойство PR_MESSAGE_CLASS?

Другие вопросы по тегам