sudo apt-get install texlive-latex-extra
sudo texhash
#pragma once
#include objbase.h
#include initguid.h
#include guiddef.h
// Interface Identifiers
// {4e3a7680-b77a-11d0-9da5-00c04fd65685}
DEFINE_GUID(CLSID_IConverterSession, 0x4e3a7680, 0xb77a, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);
// Interface Identifiers
// {4b401570-b77b-11d0-9da5-00c04fd65685}
DEFINE_GUID(IID_IConverterSession, 0x4b401570, 0xb77b, 0x11d0, 0x9d, 0xa5, 0x0, 0xc0, 0x4f, 0xd6, 0x56, 0x85);
typedef enum tagENCODINGTYPE {
IET_BINARY = 0,
IET_BASE64 = 1,
IET_UUENCODE = 2,
IET_QP = 3,
IET_7BIT = 4,
IET_8BIT = 5,
IET_INETCSET = 6,
IET_UNICODE = 7,
IET_RFC1522 = 8,
IET_ENCODED = 9,
IET_CURRENT = 10,
IET_UNKNOWN = 11,
IET_BINHEX40 = 12,
IET_LAST = 13
} ENCODINGTYPE;
typedef enum tagMIMESAVETYPE {
SAVE_RFC822 = 0,
SAVE_RFC1521 = 1
} MIMESAVETYPE;
typedef enum tagCCSF {
CCSF_SMTP = 0x0002,
CCSF_NOHEADERS = 0x0004,
CCSF_NO_MSGID = 0x4000,
CCSF_USE_RTF = 0x0080,
CCSF_INCLUDE_BCC = 0x0020
} CCSF;
class __declspec(uuid("4e3a7680-b77a-11d0-9da5-00c04fd65685"))
CConverterSession;
interface __declspec(uuid("4b401570-b77b-11d0-9da5-00c04fd65685"))
IConverterSession;
//Declaration
interface IConverterSession : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE SetAdrBook(LPADRBOOK pab);
virtual HRESULT STDMETHODCALLTYPE SetEncoding(ENCODINGTYPE et);
virtual HRESULT PlaceHolder1();
virtual HRESULT STDMETHODCALLTYPE MIMEToMAPI(LPSTREAM pstm,LPMESSAGE pmsg,LPCSTR zSrcSrv,ULONG ulFlags);
virtual HRESULT STDMETHODCALLTYPE MAPIToMIMEStm(LPMESSAGE pmsg,LPSTREAM pstm,ULONG lFlags);
virtual HRESULT PlaceHolder2();
virtual HRESULT PlaceHolder3();
virtual HRESULT PlaceHolder4();
virtual HRESULT STDMETHODCALLTYPE SetTextWrapping(BOOL fWrapText,ULONG ulWrapWidth);
virtual HRESULT STDMETHODCALLTYPE SetSaveFormat(MIMESAVETYPE mstSaveFormat);
virtual HRESULT PlaceHolder5();
};
typedef IConverterSession FAR * LPCONVERTERSESSION;
//methods for conversion
void ConvertEmlToMsg(CString sEmlFilePath,CString sMsgFilePath);
void ConvertMsgToEml(CString sMsgFilePath,CString sEmlFilePath);
ConverterSession.cpp (cpp File)
#include "StdAfx.h"
#include "ConverterSession.h"
void ConvertEmlToMsg(CString sEmlFilePath,CString sMsgFilePath)
{
IConverterSession* pConvSess = NULL;
HRESULT hr;
LPSTREAM pStream;
MAPIINIT_0 MAPIINIT= { 0, MAPI_MULTITHREAD_NOTIFICATIONS} ;
if(MAPIInitialize (&MAPIINIT) != S_OK)
return;
if(OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer,STGM_READ, (char*)(LPCSTR) sEmlFilePath,NULL,&pStream)!= S_OK)
return;
STGOPTIONS msgOpts = {0};
msgOpts.usVersion = 1,msgOpts.ulSectorSize = 4096;
LPSTORAGE pStorage = NULL;
LPMESSAGE pIMsg = NULL;
LPMALLOC pMalloc = MAPIGetDefaultMalloc();
_bstr_t bsMsgFilePath(sMsgFilePath);
if(StgCreateStorageEx(bsMsgFilePath, STGM_READWRITE STGM_TRANSACTED STGM_CREATE,STGFMT_DOCFILE, 0,&msgOpts,0,IID_IStorage,(LPVOID*)&pStorage) != S_OK)
return;
hr = OpenIMsgOnIStg(NULL,MAPIAllocateBuffer,MAPIAllocateMore,MAPIFreeBuffer, pMalloc,NULL,pStorage,NULL,0,0,&pIMsg);
if (hr != S_OK)
return;
hr = CoCreateInstance(CLSID_IConverterSession, NULL,CLSCTX_INPROC_SERVER, IID_IConverterSession, (void**)&pConvSess);
if (FAILED(hr))
return;
hr = pConvSess->SetEncoding(IET_QP);
if (FAILED(hr))
return;
hr = pConvSess->SetSaveFormat(SAVE_RFC1521);
if (FAILED(hr))
return;
hr = pConvSess->MIMEToMAPI(pStream,pIMsg,NULL,CCSF_SMTP);
if (hr != S_OK)
return;
pIMsg->SaveChanges(NULL);
pStorage->Commit(STGC_DEFAULT);
if (pStorage)
pStorage->Release();
if (pIMsg)
pIMsg->Release();
if (pStream)
pStream->Release();
if (pConvSess)
pConvSess->Release();
MAPIUninitialize();
}
void ConvertMsgToEml(CString sMsgFilePath,CString sEmlFilePath)
{
IConverterSession* pConvSess = NULL;
LPSTREAM pStr;
LPSTORAGE pStg;
LPMALLOC pMalloc;
LPMSGSESS pMsgSes;
LPMESSAGE pMsg;
_bstr_t bsMsgFilePath(sMsgFilePath);
_bstr_t bsEmlFilePath(sEmlFilePath);
MAPIINIT_0 MAPIINIT= { 0, MAPI_MULTITHREAD_NOTIFICATIONS} ;
if(MAPIInitialize (&MAPIINIT) != S_OK)
return;
HRESULT hr = CoCreateInstance(CLSID_IConverterSession, NULL,CLSCTX_INPROC_SERVER, IID_IConverterSession, (void**)&pConvSess);
if (FAILED(hr))
return;
hr = pConvSess->SetSaveFormat(SAVE_RFC1521);
if (FAILED(hr))
{
pConvSess->Release();
return;
}
hr = pConvSess->SetTextWrapping(true,72);
if (FAILED(hr))
{
pConvSess->Release();
return;
}
pMalloc = MAPIGetDefaultMalloc();
hr = OpenIMsgSession(pMalloc, 0, &pMsgSes);
if (SUCCEEDED(hr))
{
hr = StgOpenStorage(bsMsgFilePath, NULL,STGM_READWRITE STGM_TRANSACTED STGM_SHARE_DENY_NONE,NULL, 0, &pStg);
if (SUCCEEDED(hr))
{
hr = OpenIMsgOnIStg(NULL,MAPIAllocateBuffer,MAPIAllocateMore,MAPIFreeBuffer, pMalloc,NULL,pStg,NULL,0,0,&pMsg);
if (SUCCEEDED(hr))
{
hr = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, STGM_CREATE STGM_READWRITE, bsEmlFilePath, NULL, &pStr);
if (SUCCEEDED(hr))
{
hr = pConvSess->MAPIToMIMEStm(pMsg, pStr, 2);
if (SUCCEEDED(hr))
{
pStr->Commit(0);
}
}
}
}
}
if (pStg)
pStg->Release();
if (pStr)
pStr->Release();
if (pConvSess)
pConvSess->Release();
MAPIUninitialize();
}
// MAPI header files must be also included.