创建简单邮件项

适用于: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 示例应用程序中的“添加邮件”菜单上的“添加邮件”命令时显示该对话框。 DisplayAddMailDialog Mails.cpp 中的 函数显示对话框,并将值从对话框传递到 AddMail 函数。 函数 DisplayAddMailDialog 与使用 MAPI 创建邮件项不直接相关,因此此处未列出。 下面 AddMail 列出了 函数。

请注意,传递给 方法的 AddMaillpFolder 参数是指向 IMAPIFolder 接口的指针,该接口表示将在其中创建新邮件的文件夹。 给定表示 IMAPIFolder 接口的 lpFolder 参数,代码将调用 IMAPIFolder::CreateMessage 方法。 CreateMessage 方法返回成功代码和指向 IMessage : IMAPIProp 接口的指针。

大多数 AddMail 函数代码处理设置属性的工作,以准备调用 IMAPIProp::SetProps 方法。 如果对 SetProps 方法的调用成功,则对 IMAPIProp::SaveChanges 方法的调用会将更改提交到存储区并创建新的邮件项。 然后,如果请求,将调用 IMessage::SubmitMessage 方法来发送消息。

函数 AddMail 使用两个帮助程序函数为 PR_CONVERSATION_INDEXPR_REPORT_TAG 属性生成值: BuildConversationIndexAddReportTag 函数。 BuildConversationIndex位于 CreateOutlookItemsAddin.cpp 中的函数执行与内置 MAPI ScCreateConversationIndex 函数在父会话索引未传递给它时所执行的操作相同。 PidTagConversationIndex 规范属性中记录了这些函数生成的会话索引缓冲区的格式。

AddReportTag位于 Mails.cpp 中的函数反过来调用 BuildReportTag 函数来生成 PR_REPORT_TAG 属性的结构。 有关函数生成的结构 BuildReportTag 的信息,请参阅 PidTagReportTag 规范属性

下面是 函数的完整列表 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;
}

另请参阅