Поделиться через


Создание простого почтового элемента

Область применения: 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 в исходном файле Mails.cpp проекта CreateOutlookItemsAddin демонстрирует эти действия. Функция AddMail принимает параметры из диалогового окна Добавление почты , которое отображается при нажатии команды Добавить почту в меню Addins в примере приложения MFCMAPI. Функция DisplayAddMailDialog в Mails.cpp отображает диалоговое окно и передает значения из диалогового окна в функцию AddMail . Функция DisplayAddMailDialog не связана напрямую с созданием почтового элемента с помощью MAPI, поэтому она не указана здесь. Функция AddMail приведена ниже.

Обратите внимание, что параметр lpFolder , передаваемый AddMail в метод, является указателем на интерфейс IMAPIFolder , представляющий папку, в которой будет создано новое сообщение. Учитывая параметр lpFolder , представляющий интерфейс IMAPIFolder , код вызывает метод IMAPIFolder::CreateMessage . Метод CreateMessage возвращает код успешного выполнения и указатель на указатель на интерфейс IMessage : IMAPIProp .

Большая часть AddMail кода функции обрабатывает работу по настройке свойств при подготовке к вызову метода IMAPIProp::SetProps . Если вызов метода SetProps завершается успешно, вызов метода IMAPIProp::SaveChanges фиксирует изменения в хранилище и создает новый почтовый элемент. Затем при запросе вызывается метод IMessage::SubmitMessage для отправки сообщения.

Функция AddMail использует две вспомогательные функции для создания значений для свойств PR_CONVERSATION_INDEX и PR_REPORT_TAG : BuildConversationIndex и AddReportTag . Функция, расположенная в CreateOutlookItemsAddin.cpp, выполняет ту же работу, что и встроенная BuildConversationIndex функция 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;
}

См. также