Создание простого почтового элемента
Область применения: Outlook 2013 | Outlook 2016
MAPI можно использовать для создания и отправки сообщения, которое запрашивает уведомление о прочтении. При запросе уведомления о прочтении система обмена сообщениями создает и возвращает отчет о прочтении отправителю, когда получатель открывает сообщение.
Сведения о том, как скачать, просмотреть и запустить код из приложения MFCMAPI и проекта CreateOutlookItemsAddin, упоминаемого в этом разделе, см. в разделе Установка примеров, используемых в этом разделе.
Создание и отправка сообщения с запросом уведомления о прочтении
Создайте исходящее сообщение. Сведения о создании исходящего сообщения см. в разделе Обработка исходящего сообщения.
Добавьте свойство PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) и задайте для него значение true.
Добавьте свойство PR_CONVERSATION_INDEX (PidTagConversationIndex).
Добавьте свойство PR_REPORT_TAG (PidTagReportTag).
Отправьте сообщение, вызвав метод 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;
}