开发者

Send mail with Mapi with reply-to multiple emails

I'm working with MAPI library in C++ to send emails. Now I need that the emails I send have a reply-to set to more than one email and I just ca开发者_StackOverflown do it to one email.

I have been reading that to be able to do this I need to work with the objects FLATENTRYLIST (link) and FLATENTRY (link). My doubt is how can I store more than one FLATENTRY object in the FLATENTRYLIST. My experience in C++ is not very high so if anyone can help me I will apreciate.

Thanks in advance

Paulo


The FLATENTRYLIST has cEntries member that determines the number of the entries in the list. You just need to store the entries in abEntries array.


Here is the solution I developed - http://www.codeproject.com/KB/IP/CMapiEx.aspx?msg=3959770#xx3959770xx

Thanks Dmitry for your help.

When I was copying the EntryID to the FlatEntry I as copying the wrong bytes number. Here is the final code that works like a charm.

BOOL CMAPIMessage::SetReplyTo(LPADRLIST lpAddrList)
{
    HRESULT hRes = S_OK;
    SPropValue pspvReply[1];
    LPFLATENTRYLIST lpEntryList = NULL;
    BOOL bResult = false;
    CString m_strReplyToNames;

    int cb = 0; 
    int displayNameTagID = -1;
    int emailTagID = -1;
    int entryIDTagID = -1;
    int cbAllBytes = 0;

    //Get all the EntryID's bytes to initalize the FLATENTRYLIST
    for(unsigned j=0; j<lpAddrList->cEntries; j++)
    {
        for (unsigned i = 0; i < lpAddrList->aEntries[j].cValues; i++)
        {
            if (lpAddrList->aEntries[j].rgPropVals[i].ulPropTag == PR_ENTRYID)
            {
                entryIDTagID = i;
            }
        }

        if (entryIDTagID >= 0)
        {
            int feBytes = CbNewFLATENTRY(lpAddrList->aEntries[j].rgPropVals[entryIDTagID].Value.bin.cb);

            cbAllBytes += feBytes;
            cbAllBytes += ((feBytes + 4 & ~3) - feBytes);
        }   
    }

    //Allocate a new FLATENTRYLIST with all flatentries bytes
    cb = CbNewFLATENTRYLIST(cbAllBytes);
    hRes = MAPIAllocateBuffer(cb, (LPVOID *)&lpEntryList);
    if (FAILED(hRes))
    {
        bResult = false;    
        goto Cleanup;
    }

    ZeroMemory((VOID *)lpEntryList, cb);

    // Copy the bits of the FLATENTRY into the FLATENTRYLIST.
    lpEntryList->cEntries  = lpAddrList->cEntries;

    int countBytesAdded = 0;

    for(unsigned j=0; j<lpAddrList->cEntries; j++)
    {
        for (unsigned i = 0; i < lpAddrList->aEntries[j].cValues; i++)
        {
            if (lpAddrList->aEntries[j].rgPropVals[i].ulPropTag == PR_TRANSMITABLE_DISPLAY_NAME)
            {
                displayNameTagID = i;
            }
            else if (lpAddrList->aEntries[j].rgPropVals[i].ulPropTag == PR_EMAIL_ADDRESS)
            {
                emailTagID = i;
            }
            else if (lpAddrList->aEntries[j].rgPropVals[i].ulPropTag == PR_ENTRYID)
            {
                entryIDTagID = i;
            }
        }

        if ((emailTagID>=0) && (entryIDTagID>=0))
        {
            CString m_strReplyToName;
            CString m_strReplyToEmail;

            m_strReplyToEmail=lpAddrList->aEntries[j].rgPropVals[emailTagID].Value.lpszA;

            if(displayNameTagID>=0) 
                m_strReplyToName=lpAddrList->aEntries[j].rgPropVals[displayNameTagID].Value.lpszA;
            else
                m_strReplyToName = m_strReplyToEmail;

            m_strReplyToNames += (CString)m_strReplyToName + ";";

            // Allocate a new FLATENTRY structure for the PR_REPLY_RECIPIENT_ENTRIES property
            LPFLATENTRY lpReplyEntry = NULL;

            cb = CbNewFLATENTRY(lpAddrList->aEntries[j].rgPropVals[entryIDTagID].Value.bin.cb);
            hRes = MAPIAllocateBuffer(cb, (LPVOID *)&lpReplyEntry);
            if (FAILED(hRes))
            {
                bResult = false;    
                goto Cleanup;
            }

            ZeroMemory((VOID *)lpReplyEntry, cb);

            // Copy the bits of the entry id into the FLATENTRY structure
            CopyMemory(lpReplyEntry->abEntry, 
                lpAddrList->aEntries[j].rgPropVals[entryIDTagID].Value.bin.lpb, 
                                lpAddrList->aEntries[j].rgPropVals[entryIDTagID].Value.bin.cb);

            lpReplyEntry->cb = lpAddrList->aEntries[j].rgPropVals[entryIDTagID].Value.bin.cb;

            int missingBytes  = 0;
            int feBytes = CbFLATENTRY(lpReplyEntry);

            missingBytes = ((feBytes + 4 & ~3) - feBytes);

            //Copy each FLATENTRY to the abEntries, next to the previous added bytes
            CopyMemory(lpEntryList->abEntries + countBytesAdded, lpReplyEntry, feBytes);

            countBytesAdded += feBytes + missingBytes; 

            //Clean Memory
            if (lpReplyEntry) MAPIFreeBuffer(lpReplyEntry);
        }

        displayNameTagID = -1;
        emailTagID = -1;
        entryIDTagID = -1;
    }

    lpEntryList->cbEntries = countBytesAdded;

    pspvReply[0].ulPropTag = PR_REPLY_RECIPIENT_ENTRIES;

    // Allocate memory in the lpb to hold the FLATENTRYLIST
    hRes = MAPIAllocateBuffer(CbFLATENTRYLIST(lpEntryList), (LPVOID *)&pspvReply[0].Value.bin.lpb);
    if (FAILED(hRes))
    {
        bResult = false;    
        goto Cleanup;
    }

    // Copy the memory into the SPropValue
    CopyMemory(pspvReply[0].Value.bin.lpb,lpEntryList,CbFLATENTRYLIST(lpEntryList));
    pspvReply[0].Value.bin.cb = CbFLATENTRYLIST(lpEntryList);

    //Set the PR_REPLY_RECIPIENT_NAMES property with all names
    SetPropertyString(PR_REPLY_RECIPIENT_NAMES, m_strReplyToNames);

    // Set the property that contains the FLATENTRYLIST with the reply-to adresses to the message properties
    hRes = Message()->SetProps(1,pspvReply,NULL);
    if (FAILED(hRes))
    {
        bResult = false;    
        goto Cleanup;
    }

    bResult = true; 

Cleanup:
    if (lpEntryList) MAPIFreeBuffer(lpEntryList);

    return bResult;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜