How To Creating a One-Off Address (170319)



The information in this article applies to:

  • Microsoft Extended Messaging Application Programming Interface (MAPI)

This article was previously published under Q170319

SUMMARY

This article explains how to programmatically call the CreateOneOff method of the IAddrBook::IMAPIProp interface and attach the newly created address to an existing message object.

MORE INFORMATION

Most address book providers support the ability to create temporary e-mail addresses so that users can send mail to a one-time recipient or to recipients that do not appear in a read-only list or a Global Address List.

Messaging Application Programming Interface (MAPI) clients that want to facilitate this feature should follow these steps and use similar code to incorporate this feature. (NOTE: The following code segments assume an existing connection to a MAPI session exists):
   HRESULT TestAddress(LPMESSAGE pMsg)
   {
     HRESULT hRes   = S_OK;      // Status code of MAPI calls
     LPADRLIST pAdrList   = NULL;  // ModifyRecips takes LPADRLIST

     enum {NAME,
       ADDR,
       EMAIL,
       RECIP,
       EID,
       NUM_RECIP_PROPS
     };
     SizedSPropTagArray(NUM_RECIP_PROPS, sRecipProps) =
     {
       NUM_RECIP_PROPS,  // number of columns (properties)
       {
         PR_DISPLAY_NAME,
         PR_ADDRTYPE,
         PR_EMAIL_ADDRESS,
         PR_RECIPIENT_TYPE,
         PR_ENTRYID
       }
     };

     // Allocate memory for new SRowSet structure.
     hRes = MAPIAllocateBuffer(CbNewSRowSet(1),
       (LPVOID*) &pAdrList);
     if (FAILED(hRes)) goto Quit;

   // Zero out allocated memory.
     ZeroMemory(pAdrList, CbNewSRowSet(1));

   // Allocate memory for SPropValue structure that indicates what
   // recipient properties will be set. NUM_RECIP_PROPS == 5.
      hRes = MAPIAllocateBuffer(
       NUM_RECIP_PROPS * sizeof(SPropValue),
       (LPVOID*) &(pAdrList->aEntries[0].rgPropVals));
   if (FAILED(hRes)) goto Quit;

   // Zero out allocated memory.
     ZeroMemory(pAdrList -> aEntries[0].rgPropVals,
       NUM_RECIP_PROPS * sizeof(SPropValue) );

   // Setup the One Time recipient by indicating how many
   // recipients and how many properties will be set on each // recipient.

     pAdrList->cEntries = 1;   // How many recipients.
   // How many properties per recipient
     pAdrList->aEntries[0].cValues = NUM_RECIP_PROPS;

   // Set the SPropValue members == the desired values.
    pAdrList->aEntries[0].rgPropVals[NAME].ulPropTag =     PR_DISPLAY_NAME;
    pAdrList->aEntries[0].rgPropVals[NAME].Value.lpszA =
       "<Display Name>";

    pAdrList->aEntries[0].rgPropVals[ADDR].ulPropTag =
       PR_ADDRTYPE;
    pAdrList->aEntries[0].rgPropVals[ADDR].Value.lpszA =
       "SMTP";

    pAdrList->aEntries[0].rgPropVals[EMAIL].ulPropTag =
       PR_EMAIL_ADDRESS;
    pAdrList->aEntries[0].rgPropVals[EMAIL].Value.lpszA =
       "<email address>";

    pAdrList->aEntries[0].rgPropVals[RECIP].ulPropTag =
       PR_RECIPIENT_TYPE;
    pAdrList->aEntries[0].rgPropVals[RECIP].Value.l =
       MAPI_TO;

    pAdrList->aEntries[0].rgPropVals[EID].ulPropTag =
       PR_ENTRYID;

   // Create the One-off address and get an EID for it.
     hRes = m_pAddrBook->CreateOneOff(
       pAdrList-> aEntries[0].rgPropVals[NAME].Value.lpszA,
       pAdrList-> aEntries[0].rgPropVals[ADDR].Value.lpszA,
       pAdrList-> aEntries[0].rgPropVals[EMAIL].Value.lpszA,
       0,
       &pAdrList->aEntries[0].rgPropVals[EID].Value.bin.cb,
       (LPENTRYID*)
       (&pAdrList->aEntries[0].rgPropVals[EID].Value.bin.lpb));
     if (FAILED(hRes)) goto Quit;

     hRes = m_pAddrBook->ResolveName(
       0L,
       0L,
       NULL,
       pAdrList );
     if (FAILED(hRes)) goto Quit;

   // If everything goes right, add the new recipient to the
   // message object passed into us.
     hRes = pMsg->ModifyRecipients(MODRECIP_ADD,pAdrList);
     if (FAILED(hRes)) goto Quit;

     hRes = pMsg->SaveChanges(FORCE_SAVE);
     if (FAILED(hRes)) goto Quit;

   Quit:
   // Always release any newly created objects and
   // allocated memory.
     FreePadrlist(pAdrList);

     return hRes;
   }
				

Modification Type:MinorLast Reviewed:8/18/2005
Keywords:kbcode kbhowto kbMsg KB170319