建立簡單的郵件專案
適用於:Outlook 2013 |Outlook 2016
MAPI 可用來建立和傳送要求讀取回條的訊息。 要求讀取回條時,當收件者開啟郵件時,傳訊系統會產生讀取報表並傳回給寄件者。
如需如何從 MFCMAPI 應用程式下載、檢視及執行程式代碼以及本主題所參考 CreateOutlookItemsAddin 專案的相關信息,請參閱 安裝本節中使用的範例。
建立及傳送要求讀取回條的訊息
建立傳出訊息。 如需如何建立傳出訊息的相關信息,請參閱 處理傳出訊息。
將 PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) 屬性,並將它設定為 true。
新增 PR_CONVERSATION_INDEX (PidTagConversationIndex) 屬性。
新增 PR_REPORT_TAG (PidTagReportTag) 屬性。
呼叫 IMessage::SubmitMessage 方法來傳送訊息。
AddMail
CreateOutlookItemsAddin 專案Mails.cpp原始程式檔中的 函式會示範這些步驟。 函AddMail
式會從 [新增郵件] 對話框取得參數,當您按兩下 MFCMAPI 範例應用程式中 [載入宏] 選單上的 [新增郵件] 命令時,就會顯示這些參數。
DisplayAddMailDialog
Mails.cpp中的函式會顯示對話方塊,並將對話框中的值傳遞至AddMail
函式。 函 DisplayAddMailDialog
式與使用MAPI建立郵件專案沒有直接關聯,因此不會列於此處。 函 AddMail
式如下所示。
請注意,傳遞至 方法的 AddMail
lpFolder 參數是 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
函式。 位於 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;
}