【转】

How to: Send a Message

Send Feedback on this topic to the authors

See Also

Messaging | Messaging Overview | How to: Begin a MAPI Session | How to: Connect to a Message Store | How to: Create a Message | How to: End a MAPI Session | Messaging Sample Code

Developer's Reference > Native Code > Networking and Communication > Messaging

New messages are always created and sent from a message store's Drafts folder. After you create a message, you set its property values (subject, body, list of recipients, and so on) and then post the message.

To send a message

  1. Initialize the MAPI subsystem, and log onto a MAPI session. For more information, see How to: Begin a MAPI Session.
  2. Establish a connection to a message store. For more information, see How to: Connect to a Message Store.
  3. Create a message object. For more information, see How to: Create a Message.
  4. Prepare and set the list of recipients for the message. Typically, there are three properties to set for each recipient: PR_RECIPIENT_TYPE, PR_ADDRTYPE, and PR_EMAIL_ADDRESS.
    1. Allocate memory for the list of recipients by calling MAPIAllocateBuffer with the total size of the recipient list:
      ULONG cRecipients = 1;  // Sending this to only 1 person.
      LPWSTR pszTo = L"you@mycompany.com";  // Address of recipient.
      ULONG cRecProps = 3;  // Setting 3 properties for each recipient.
      LPADRLIST pRecList = NULL;
      ULONG cbRecList = 0;
      cbRecList = sizeof(ADRLIST) + 
                  cRecipients * (sizeof(ADRENTRY) + 
                      cRecProps * (sizeof(SPropValue) + 
                          (wcslen(pszTo)+3) * sizeof(WCHAR) ) );
      hr = MAPIAllocateBuffer(cbRecList, (void **)&pRecList);
    2. Initialize the recipient list by using memset to set the entire buffer to 0, and then begin filling in values for the recipient list:
      LPSPropValue pRecVal = NULL;
      memset((void *)pRecList, 0, cbRecList);
      pRecList->cEntries = cRecipients;
      pRecList->aEntries[0].cValues = cRecProps;
      pRecVal = pRecList->aEntries[0].rgPropVals;
    3. Set the recipient type property value to indicate whether the recipient is listed on the To:, Cc:, or Bcc: fields by using the PR_RECIPIENT_TYPE property. This is the first of three properties that are being set in the recipient list:
      pRecVal[0]->ulPropTag = PR_RECIPIENT_TYPE;
      pRecVal[0]->Value.ul = MAPI_TO;
    4. Set the address type property value to SMTP by using the PR_ADDRTYPE property. This is the second of three properties that are being set in the recipient list:
      pRecVal[1]->ulPropTag = PR_ADDRTYPE;
      pRecVal[1]->Value.lpszW = L"SMTP";
    5. Set the e-mail address for each message recipient by using the PR_EMAIL_ADDRESS property. This is the third and final property that is being set in the recipient list:
      pRecVal[2]->ulPropTag = PR_EMAIL_ADDRESS;
      pRecVal[2]->Value.lpszW = pszTo;
    6. Add the list of recipients to your message by calling the IMessage::ModifyRecipients method with the MODRECIP_ADD flag:
      hr = pMsg->ModifyRecipients(MODRECIP_ADD, pRecList);
    7. Free the memory buffer for the list of recipients by calling MAPIFreeBuffer.
      hr = MAPIFreeBuffer((void *)pRecList);
      pRecVal = NULL;
  5. Prepare and set the following properties of the message: PR_MSG_STATUS, PR_MESSAGE_FLAGS, and PR_SUBJECT.
    1. Allocate memory for the message property array by calling MAPIAllocateBuffer with the total size of the message properties:
      ULONG cMsgProps = 3;  // Setting 3 properties for the message.
      LPWSTR pszSubject = L"MySubject";  // Subject line of message.
      LPSPropValue pMsgVal = NULL;
      ULONG cbMsgVal = 0;
      cbMsgVal = cMsgProps * (sizeof(SPropValue) + 
                     (wcslen(pszSubject)+3) * sizeof(WCHAR) );
      hr = MAPIAllocateBuffer(cbMsgVal, (void **)&pMsgVal);
    2. Initialize the message property array by using memset to set the entire buffer to 0:
      memset((void *)pMsgVal, 0, cbMsgVal);
    3. Identify the message as SMTP by using the PR_MSG_STATUS property to set the message status to MSGSTATUS_RECTYPE_SMTP. This is the first of three properties that are being set for the message:
      pMsgVal[0]->ulPropTag = PR_MSG_STATUS;
      pMsgVal[0]->Value.ul = MSGSTATUS_RECTYPE_SMTP;
    4. Identify the current state of the message as unsent by using the PR_MESSAGE_FLAGS property to set the MSGFLAG_UNSENT flag. This is the second of three properties that are being set for the message:
      pMsgVal[1]->ulPropTag = PR_MESSAGE_FLAGS;
      pMsgVal[1]->Value.ul = MSGFLAG_UNSENT;
    5. Set the subject by using the PR_SUBJECT property. This is the third and final property that is being set for the message:
      pMsgVal[2]->ulPropTag = PR_SUBJECT;
      pMsgVal[2]->Value.lpszW = pszSubject;
    6. Apply the property values to the message by calling the IMAPIProp::SetProps method on the message object:
      hr = pMsg->SetProps(cMsgProps, pMsgVal, NULL);
    7. Free the memory buffer for the message property array by calling MAPIFreeBuffer.
      hr = MAPIFreeBuffer((void *)pMsgVal);
  6. Prepare and write the textual body of the message.
    1. Declare a NULL IStream interface object, and then call the IMAPIProp::OpenProperty method of the message object to obtain a reference to the message body text stream interface object:
      IStream * pStm = NULL;
      hr = pMsg->OpenProperty(PR_BODY, 
                              NULL, 
                              0, 
                              MAPI_MODIFY, 
                              (LPUNKNOWN *)&pStm);
    2. Write the text of the body of the message by calling the IStream::Write method of the stream object:
      LPWSTR pszBody = L"Text in Body of Message.";
      ULONG cbBody = 0;
      ULONG cbWritten = 0;
      cbBody = (wcslen(pszBody)+1) * sizeof(WCHAR);
      hr = pStm->Write(pszBody, cbBody, &cbWritten);
    3. If it is no longer needed, release the stream object by calling IUnknown::Release on it:
      pStm->Release();
      pStm = NULL;
  7. Submit the message by calling the IMessage::SubmitMessage method of the message object:
    hr = pMsg->SubmitMessage(0);
  8. If it is no longer needed, release the message object by calling IUnknown::Release on it:
    pMsg->Release();
    pMsg = NULL;
Code Sample

The Pocket PC 2003 SDK ships with a code sample called SendMail. To run it, double-click the SendMail.vcw workspace file. The default location for the the sample is C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Samples\Win32\SendMail\.

See Also

Messaging | Messaging Overview | How to: Begin a MAPI Session | How to: Connect to a Message Store | How to: Create a Message | How to: End a MAPI Session | Messaging Sample Code


Last updated on Thursday, April 21, 2005

Send Feedback on this topic to the authors

© 2005 Microsoft Corporation. All rights reserved.

转载于:https://www.cnblogs.com/pursuer/archive/2010/03/06/1679671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值