1

EML を MSG ファイルに変換しようとしています。IStorage オブジェクトに mapi オブジェクト IMessage を作成します。クラス ID CLSID_Message を IStorage オブジェクトに割り当てます。EML ファイルを解析し、プロパティを読み取り、それらを mapi IMessage オブジェクトに割り当てます。mapi IMessage オブジェクトで Save() を呼び出します。IStorage オブジェクトで Commit() を呼び出しました。生成された MSG ファイルを Outlook で読み取ることができませんでした。そこで、以下に説明する別の方法を試しました。

IStorage に 2 番目の IMessage オブジェクトを作成しました。最初の IMessage オブジェクトで IMessage::CopyTo() を呼び出し、IStorage オブジェクトでホストされている 2 番目の IMessage にデータを転送します。生成された MSG ファイルが再び OutLook で読み取れなくなりました。

PST 内に IMessage オブジェクトを作成すると、生成された MSG ファイルを OutLook で読み取ることができます。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();
}

このようなことを経験したことがある方がいらっしゃいましたら教えてください。

ありがとうございました

4

1 に答える 1