You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中MAPI的IConverterSession::MIMEToMAPI转换后邮件内容为空

MIMEToMAPI转换后Outlook消息内容为空问题排查

我尝试通过MAPI将EML文件内容转换为IMESSAGE数据,自行实现了IConverterSession接口,全程未触发FAILED(hr)错误,但在Outlook 2016(非C2R版本)存储中创建的新pMessage内容为空。

EML文件、流数据均正常,同一文件使用Python pywin32可完成正常转换,CLSID_IConverterSession已在注册表中正确注册,无论是否设置字符集,结果都一致,为何MIMEToMAPI无法正常工作?

代码实现如下

#define USES_IID_IMAPIFolder

#include <initguid.h>
#include <mapiutil.h>
#include <mimeole.h>

interface IConverterSession : public IUnknown {
public:
    virtual HRESULT STDMETHODCALLTYPE MIMEToMAPI(LPSTREAM pstm, LPMESSAGE pmsg, LPCSTR pszSrcSrv, ULONG ulFlags)=0;
};


DEFINE_GUID(CLSID_IConverterSession, 0x4e3a7680, 0xb77a, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);
DEFINE_GUID(IID_IConverterSession, 0x4b401570, 0xb77b, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);

// ...

hr =  pInboxFolder->CreateMessage(nullptr, 0, &pMessage); // pInboxFolder is valid

IConverterSession *pIConverter = nullptr;
HRESULT hr = CoCreateInstance(
    CLSID_IConverterSession, nullptr, CLSCTX_INPROC_SERVER,
    IID_IConverterSession, reinterpret_cast<LPVOID*>(&pIConverter)
);

if (FAILED(hr) || !pIConverter) {
    std::cout << "CoCreateInstance failed: 0x" << std::hex << hr << "\n";
    return hr;
}

LPSTREAM pStream = nullptr;
hr = OpenStreamOnFile(
        MAPIAllocateBuffer, MAPIFreeBuffer, STGM_READ,
        (LPTSTR)emlPath.c_str(), nullptr, &pStream
);

if (FAILED(hr) || !pStream) {
        std::cout << "OpenStreamOnFile failed: 0x" << std::hex << hr << "\n";
        return hr;
}

hr = pIConverter->MIMEToMAPI(pStream, pMessage, nullptr, CCSF_SMTP | CCSF_INCLUDE_BCC);

if (FAILED(hr) || !pMessage) {
    std::cout << "MIMEToMAPI failed: 0x" << std::hex << hr << "\n";
    return hr;
}

hr = pMessage->SaveChanges(0);

内容的提问来源于stack exchange,提问作者jin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:54:50