INFO: Uložiť správy do súboru MSG zlúčenina

Preklady článku Preklady článku
ID článku: 171907 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

SUHRN

Tento článok obsahuje kód, ktorý demonštruje, ako uložiť správy kŕmne dokumentu--osobitne .msg súbor--, ktorý je čitateľný akýmkoľvek klient, ktorý podporuje formát súboru .msg.

DALSIE INFORMACIE

Funkciu pod berie objekt platnou správou ako v parameter a používa jej vlastností vytvoriť duplicitné správy a uložte ho na zložený súbor vo formáte .msg. Správy je predmet použiť ako názov súboru nového súboru.

Poznámka: Špeciálne znaky v riadku predmet parametra v tejto funkcia môže spôsobiť neočakávané výsledky. Zatiaľ čo kód môže byť napísaný na zabránenie špeciálnych znakov v riadku predmet, nie je relevantné na tému a takýto kódex je zámerne vynechali.
#define INITGUID
#include <objbase.h>

#define USES_IID_IMessage

#include <mapix.h>
#include <mapitags.h>
#include <mapidefs.h>
#include <mapiutil.h>
#include <mapiguid.h>
#include <imessage.h>

// {00020D0B-0000-0000-C000-000000000046}
DEFINE_GUID(CLSID_MailMessage,
0x00020D0B,
0x0000, 0x0000, 0xC0, 0x00, 0x0, 0x00, 0x0, 0x00, 0x00, 0x46);

HRESULT SaveToMSG ( LPMESSAGE pMessage )
{
    HRESULT hRes = S_OK;
    LPSPropValue pSubject = NULL;
    LPSTORAGE pStorage = NULL;
    LPMSGSESS pMsgSession =  NULL;
    LPMESSAGE pIMsg = NULL;
    SizedSPropTagArray ( 7, excludeTags );
    char szPath[_MAX_PATH];
    char strAttachmentFile[_MAX_PATH];
    LPWSTR lpWideCharStr = NULL;
    ULONG cbStrSize = 0L;

    // create the file name in the directory where "TMP" is defined
    // with subject as the filename and ".msg" extension.

    // get temp file directory
    GetTempPath(_MAX_PATH, szPath);

    // get subject line of message to copy. This will be used as the
    // new file name.
    HrGetOneProp( pMessage, PR_SUBJECT, &pSubject );

    // fuse path, subject, and suffix into one string
    strcpy ( strAttachmentFile, szPath );
    strcat ( strAttachmentFile, pSubject->Value.lpszA  );
    strcat ( strAttachmentFile, ".msg");

    // get memory allocation function
    LPMALLOC pMalloc = MAPIGetDefaultMalloc();

    // Convert new file name to WideChar
    cbStrSize = MultiByteToWideChar (CP_ACP,
                                     MB_PRECOMPOSED,
                                     strAttachmentFile,
                                     -1, lpWideCharStr, 0);

    MAPIAllocateBuffer ( cbStrSize * sizeof(WCHAR),
                            (LPVOID *)&lpWideCharStr );

    MultiByteToWideChar (CP_ACP,
                         MB_PRECOMPOSED,
                         strAttachmentFile,
                         -1, lpWideCharStr, cbStrSize );

    // create compound file
    hRes = ::StgCreateDocfile(lpWideCharStr,
                              STGM_READWRITE |
                              STGM_TRANSACTED |
                              STGM_CREATE, 0, &pStorage);

    // Open an IMessage session.
    hRes = ::OpenIMsgSession(pMalloc, 0, &pMsgSession);

    // Open an IMessage interface on an IStorage object
    hRes = ::OpenIMsgOnIStg(pMsgSession,
                            MAPIAllocateBuffer,
                            MAPIAllocateMore,
                            MAPIFreeBuffer,
                            pMalloc,
                            NULL,
                            pStorage,
                            NULL, 0, 0, &pIMsg);

    // write the CLSID to the IStorage instance - pStorage. This will
    // only work with clients that support this compound document type
    // as the storage medium. If the client does not support
    // CLSID_MailMessage as the compound document, you will have to use
    // the CLSID that it does support.
    hRes = WriteClassStg(pStorage, CLSID_MailMessage );

    // Specify properties to exclude in the copy operation. These are
    // the properties that Exchange excludes to save bits and time.
    // Should not be necessary to exclude these, but speeds the process
    // when a lot of messages are being copied.
    excludeTags.cValues = 7;
    excludeTags.aulPropTag[0] = PR_ACCESS;
    excludeTags.aulPropTag[1] = PR_BODY;
    excludeTags.aulPropTag[2] = PR_RTF_SYNC_BODY_COUNT;
    excludeTags.aulPropTag[3] = PR_RTF_SYNC_BODY_CRC;
    excludeTags.aulPropTag[4] = PR_RTF_SYNC_BODY_TAG;
    excludeTags.aulPropTag[5] = PR_RTF_SYNC_PREFIX_COUNT;
    excludeTags.aulPropTag[6] = PR_RTF_SYNC_TRAILING_COUNT;

    // copy message properties to IMessage object opened on top of
    // IStorage.
    hRes = pMessage->CopyTo(0, NULL,
                            (LPSPropTagArray)&excludeTags,
                            NULL, NULL,
                            (LPIID)&IID_IMessage,
                            pIMsg, 0, NULL );

    // save changes to IMessage object.
    pIMsg -> SaveChanges ( KEEP_OPEN_READWRITE );

    // save changes in storage of new doc file
    hRes = pStorage -> Commit(STGC_DEFAULT);

    // free objects and clean up memory
    MAPIFreeBuffer ( lpWideCharStr );
    pStorage->Release();
    pIMsg->Release();
    CloseIMsgSession ( pMsgSession );

    pStorage = NULL;
    pIMsg = NULL;
    pMsgSession = NULL;
    lpWideCharStr = NULL;

    return hRes;
}
				
Všetky verzie Outlook a Exchange Client podporujú CLSID_MailMessage ako kŕmnych dokument. Jediný dôvod, prečo používať odlišným identifikátorom CLSID je podporovať iné klienti, ktorí používajú rôzne CLISD pri písaní správy štruktúrované skladovania.

Pri ukladaní správy, ktoré majú veľký počet príjemcov alebo príloh, je možné, že showing operácia zlyhá s MAPI_E_NOT_ENOUGH_MEMORY. Toto je známy problém s štruktúrované skladovania a prúdov. Zakaždým, že novou prílohou alebo príjemca je pridať do správy, sa neuložia v štruktúrovaných skladovania, otvoriť nový súbor Storage Root. Tieto súbory nie sú uzatvorené, kým transakcia neskončí. Pretože operačný systém ukladá obmedzenie na počet súčasne otvorených koreňový ukladacích súborov, neexistuje žiadne známe riešenie. Ďalšie informácie získate kliknutím na nasledujúce číslo článku databázy Microsoft Knowledge Base:
163202 Limit počtu Simultaeously otvoriť Root ukladacích súborov
Všetky verzie programu Outlook sú ovplyvnené toto obmedzenie rovnako.

Vlastnosti

ID článku: 171907 - Posledná kontrola: 18. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Office Outlook 2007
  • Messaging Application Programming Interface
Kľúčové slová: 
kbinfo kbmsg kbmt KB171907 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:171907

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com