我正在尝试将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();
}
如果你们有任何经验,请告诉我。
谢谢
答案 0 :(得分:2)
尝试在OutlookSpy中打开MSG文件 - 单击OpenIMsgOnIStg按钮。与好消息相比,是否缺少任何属性?
您是否尝试过使用IConverterSession进行转换?
Outlook显示的确切错误是什么?你设置了PR_MESSAGE_CLASS属性吗?