我正在尝试将 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();
}
请让我知道你们中是否有人有这方面的经验。
谢谢