共用方式為


建立簡單的郵件專案

適用於:Outlook 2013 |Outlook 2016

MAPI 可用來建立和傳送要求讀取回條的訊息。 要求讀取回條時,當收件者開啟郵件時,傳訊系統會產生讀取報表並傳回給寄件者。

如需如何從 MFCMAPI 應用程式下載、檢視及執行程式代碼以及本主題所參考 CreateOutlookItemsAddin 專案的相關信息,請參閱 安裝本節中使用的範例

建立及傳送要求讀取回條的訊息

  1. 建立傳出訊息。 如需如何建立傳出訊息的相關信息,請參閱 處理傳出訊息

  2. PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) 屬性,並將它設定為 true

  3. 新增 PR_CONVERSATION_INDEX (PidTagConversationIndex) 屬性。

  4. 新增 PR_REPORT_TAG (PidTagReportTag) 屬性。

  5. 呼叫 IMessage::SubmitMessage 方法來傳送訊息。

AddMail CreateOutlookItemsAddin 專案Mails.cpp原始程式檔中的 函式會示範這些步驟。 函AddMail式會從 [新增郵件] 對話框取得參數,當您按兩下 MFCMAPI 範例應用程式中 [載入宏] 選單上的 [新增郵件] 命令時,就會顯示這些參數。 DisplayAddMailDialogMails.cpp中的函式會顯示對話方塊,並將對話框中的值傳遞至AddMail函式。 函 DisplayAddMailDialog 式與使用MAPI建立郵件專案沒有直接關聯,因此不會列於此處。 函 AddMail 式如下所示。

請注意,傳遞至 方法的 AddMaillpFolder 參數是 IMAPIFolder 介面的指標,代表將建立新訊息的資料夾。 假設 lpFolder 參數代表 IMAPIFolder 介面,程式代碼會呼叫 IMAPIFolder::CreateMessage 方法。 CreateMessage 方法會傳回成功程式代碼和指向 IMessage : IMAPIProp 介面之指標的指標。

大部分的 AddMail 函式程式代碼會處理設定屬性的工作,以準備呼叫 IMAPIProp::SetProps 方法。 如果 呼叫 SetProps 方法成功,則呼叫 IMAPIProp::SaveChanges 方法會認可對存放區的變更,並建立新的郵件專案。 然後,如果要求,則會呼叫 IMessage::SubmitMessage 方法來傳送訊息。

AddMail 式會使用兩個協助程式函式來建 置PR_CONVERSATION_INDEXPR_REPORT_TAG 屬性的 BuildConversationIndex 值:和 AddReportTag 函式。 位於 BuildConversationIndex CreateOutlookItemsAddin.cpp 中的函式會執行與內建 MAPI ScCreateConversationIndex 函式在父交談索引未傳遞至父交談索引時所執行的相同工作。 這些函式產生的交談索引緩衝區格式記載於 PidTagConversationIndex Canonical 屬性中。

位於 AddReportTag Mails.cpp 中的函式會接著呼叫 BuildReportTag 函式,以建置 PR_REPORT_TAG屬性的 結構。 如需函式所建置結構的 BuildReportTag 相關信息,請參閱 PidTagReportTag Canonical 屬性

以下是函式的 AddMail 完整清單。

HRESULT AddMail(LPMAPISESSION lpMAPISession,
            LPMAPIFOLDER lpFolder,
            LPWSTR szSubject, // PR_SUBJECT_W, PR_CONVERSATION_TOPIC
            LPWSTR szBody, // PR_BODY_W
            LPWSTR szRecipientName, // Recipient table
            BOOL bHighImportance, // PR_IMPORTANCE
            BOOL bReadReceipt, // PR_READ_RECEIPT_REQUESTED
            BOOL bSubmit,
            BOOL bDeleteAfterSubmit)
{
   if (!lpFolder) return MAPI_E_INVALID_PARAMETER;
   HRESULT hRes = S_OK;
   LPMESSAGE lpMessage = 0;
   // Create a message and set its properties
   hRes = lpFolder->CreateMessage(0,
      0,
      &lpMessage);
   if (SUCCEEDED(hRes))
   {
      // Because the properties to be set are known in advance, 
      // most of the structures involved can be statically declared 
      // to minimize expensive MAPIAllocateBuffer calls.
      SPropValue spvProps[NUM_PROPS] = {0};
      spvProps[p_PR_MESSAGE_CLASS_W].ulPropTag          = PR_MESSAGE_CLASS_W;
      spvProps[p_PR_ICON_INDEX].ulPropTag                 = PR_ICON_INDEX;
      spvProps[p_PR_SUBJECT_W].ulPropTag                = PR_SUBJECT_W;
      spvProps[p_PR_CONVERSATION_TOPIC_W].ulPropTag     = PR_CONVERSATION_TOPIC_W;
      spvProps[p_PR_BODY_W].ulPropTag                   = PR_BODY_W;
      spvProps[p_PR_IMPORTANCE].ulPropTag               = PR_IMPORTANCE;
      spvProps[p_PR_READ_RECEIPT_REQUESTED].ulPropTag   = PR_READ_RECEIPT_REQUESTED;
      spvProps[p_PR_MESSAGE_FLAGS].ulPropTag             = PR_MESSAGE_FLAGS;
      spvProps[p_PR_MSG_EDITOR_FORMAT].ulPropTag         = PR_MSG_EDITOR_FORMAT;
      spvProps[p_PR_MESSAGE_LOCALE_ID].ulPropTag         = PR_MESSAGE_LOCALE_ID;
      spvProps[p_PR_INETMAIL_OVERRIDE_FORMAT].ulPropTag = PR_INETMAIL_OVERRIDE_FORMAT;
      spvProps[p_PR_DELETE_AFTER_SUBMIT].ulPropTag      = PR_DELETE_AFTER_SUBMIT;
      spvProps[p_PR_INTERNET_CPID].ulPropTag            = PR_INTERNET_CPID;
      spvProps[p_PR_CONVERSATION_INDEX].ulPropTag         = PR_CONVERSATION_INDEX;
      spvProps[p_PR_MESSAGE_CLASS_W].Value.lpszW = L"IPM.Note";
      spvProps[p_PR_ICON_INDEX].Value.l = 0x103; // Unsent Mail
      spvProps[p_PR_SUBJECT_W].Value.lpszW = szSubject;
      spvProps[p_PR_CONVERSATION_TOPIC_W].Value.lpszW = szSubject;
      spvProps[p_PR_BODY_W].Value.lpszW = szBody;
      spvProps[p_PR_IMPORTANCE].Value.l = bHighImportance?IMPORTANCE_HIGH:IMPORTANCE_NORMAL;
      spvProps[p_PR_READ_RECEIPT_REQUESTED].Value.b = bReadReceipt?true:false;
      spvProps[p_PR_MESSAGE_FLAGS].Value.l = MSGFLAG_UNSENT;
      spvProps[p_PR_MSG_EDITOR_FORMAT].Value.l = EDITOR_FORMAT_PLAINTEXT;
      spvProps[p_PR_MESSAGE_LOCALE_ID].Value.l = 1033; // (en-us)
      spvProps[p_PR_INETMAIL_OVERRIDE_FORMAT].Value.l = NULL; // Mail system chooses default encoding scheme
      spvProps[p_PR_DELETE_AFTER_SUBMIT].Value.b = bDeleteAfterSubmit?true:false;
      spvProps[p_PR_INTERNET_CPID].Value.l = cpidASCII;
      hRes = BuildConversationIndex(
         &spvProps[p_PR_CONVERSATION_INDEX].Value.bin.cb,
         &spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb);
      if (SUCCEEDED(hRes))
      {
         hRes = lpMessage->SetProps(NUM_PROPS, spvProps, NULL);
         if (SUCCEEDED(hRes))
         {
            hRes = AddRecipient(lpMAPISession,
               lpMessage,
               MAPI_TO,
               szRecipientName);
            AddInLog(true,L"CallMenu: AddRecipient - returned hRes = 0x%08X\n",hRes);
            if (SUCCEEDED(hRes))
            {
               if (bReadReceipt)
               {
                  hRes = AddReportTag(lpMessage);
               }
               if (SUCCEEDED(hRes))
               {
                  hRes = lpMessage->SaveChanges(KEEP_OPEN_READWRITE);
                  if (SUCCEEDED(hRes) && bSubmit)
                  {
                     hRes = lpMessage->SubmitMessage(NULL);
                  }
               }
            }
         }
      }
      if (spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb)
         delete[] spvProps[p_PR_CONVERSATION_INDEX].Value.bin.lpb;
   }
   if (lpMessage) lpMessage->Release();
   return hRes;
}

另請參閱