Récupérer le corps du message dans rtf compressé et le convertir dans son format natif
S’applique à : Outlook 2013 | Outlook 2016
Cet exemple de code dans Microsoft C++ vous montre comment utiliser le Microsoft Outlook 2010 exporté ou la fonction Microsoft Outlook 2013 WrapCompressedRTFStreamEx pour accéder au corps d’un message encapsulé dans rtf compressé et obtenir le corps dans son format natif.
//These are definitions for the WrapCompressedRTFStreamEx function.
typedef HRESULT (STDMETHODCALLTYPE WRAPCOMPRESSEDRTFSTREAMEX) (
LPSTREAM lpCompressedRTFStream, CONST RTF_WCSINFO * pWCSInfo, LPSTREAM * lppUncompressedRTFStream, RTF_WCSRETINFO * pRetInfo);
typedef WRAPCOMPRESSEDRTFSTREAMEX *LPWRAPCOMPRESSEDRTFSTREAMEX;
HRESULT TestWrapCompressedRTFStreamEx(LPMESSAGE lpMsg)
{
HRESULT hRes = S_OK;
LPSTREAM lpCompressed = NULL;
LPSTREAM lpUncompressed = NULL;
char szBody[1024] = {0};
ULONG ulRead = 0;
RTF_WCSINFO wcsinfo = {0};
RTF_WCSRETINFO retinfo = {0};
LPSPropValue lpPropCPID = NULL;
retinfo.size = sizeof(RTF_WCSRETINFO);
wcsinfo.size = sizeof(RTF_WCSINFO);
wcsinfo.ulFlags = MAPI_NATIVE_BODY;
wcsinfo.ulOutCodePage = 0;
// Retrieve the value of the Internet code page.
// Pass this value to the WrapCompressedRTFStreamEx function.
// If the property is not found, the default is 0.
if(SUCCEEDED(hRes = HrGetOneProp(lpMsg, PR_INTERNET_CPID, &lpPropCPID)))
{
wcsinfo.ulInCodePage = lpPropCPID->Value.l;
}
// Open the compressed RTF stream.
if(SUCCEEDED(hRes = lpMsg->OpenProperty(PR_RTF_COMPRESSED,
&IID_IStream,
STGM_READ | STGM_DIRECT,
0,
(LPUNKNOWN*)&lpCompressed)))
{
// Notice that the WrapCompressedRTFStreamEx function has been loaded
// by using the GetProcAddress function into pfnWrapEx.
// Call the WrapCompressedRTFStreamEx function.
if(SUCCEEDED(hRes = pfnWrapEx(lpCompressed,
&wcsinfo,
&lpUncompressed,
&retinfo)))
{
printf("Body's native type is: ");
// Check what the native body type is.
switch(retinfo.ulStreamFlags)
{
case MAPI_NATIVE_BODY_TYPE_RTF:
printf("MAPI_NATIVE_BODY_TYPE_RTF\n");
break;
case MAPI_NATIVE_BODY_TYPE_HTML:
printf("MAPI_NATIVE_BODY_TYPE_HTML\n");
break;
case MAPI_NATIVE_BODY_TYPE_PLAINTEXT:
printf("MAPI_NATIVE_BODY_TYPE_PLAINTEXT\n");
break;
default:
printf("UNKNOWN\n");
}
// Read the first 1,000 characters out of the stream.
if(SUCCEEDED(hRes = lpUncompressed->Read(szBody, 1024, &ulRead)))
{
printf("First %d characters of the native body stream:\n%s\n", ulRead, szBody);
}
}
}
MAPIFreeBuffer(lpPropCPID);
if(lpUncompressed)lpUncompressed->Release();
if(lpCompressed)lpCompressed->Release();
return hRes;
}