使用IStorage时,EML到MSG转换失败

时间:2013-06-08 02:33:26

标签: mapi msg istorage

我正在尝试将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();
}

如果你们有任何经验,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

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