1

我正在尝试将 EML 转换为 MSG 文件。我在 IStorage 对象上创建 mapi 对象 IMessage;将 class-id CLSID_Message 分配给 IStorage 对象;解析 EML 文件,读取属性并将它们分配给 mapi IMessage 对象;在 mapi IMessage 对象上调用 Save();在 IStorage 对象上调用 Commit();Outlook 无法读取生成的 MSG 文件。所以我尝试了另一种方法,如下所述。

在 IStorage 上创建了第二个 IMessage 对象;在第一个 IMessage 对象上调用 IMessage::CopyTo(),将数据传输到托管在 IStorage 对象上的第二个 IMessage;OutLook 再次无法读取生成的 MSG 文件。

如果我在 PST 中创建 IMessage 对象,则 OutLook 可以读取生成的 MSG 文件。我认为当我在 IStorage 上创建 IMessage 时发生了一些事情。我能够从 IMessage 对象中读取 PR_SUBJECT,因此发生了 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();
}

请让我知道你们中是否有人有这方面的经验。

谢谢

4

1 回答 1

2

尝试在OutlookSpy中打开 MSG 文件- 单击 OpenIMsgOnIStg 按钮。与好消息相比,是否缺少任何属性?

您是否尝试过使用 IConverterSession 执行转换?

Outlook 显示的确切错误是什么?您是否设置了 PR_MESSAGE_CLASS 属性?

于 2013-06-10T21:49:09.833 回答