単純なメール アイテムを作成する
適用対象: 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 サンプル アプリケーションの [ アドイン] メニューの [ メールの追加 ] コマンドをクリックしたときに表示される [メールの 追加 ] ダイアログ ボックスからパラメーターを受け取ります。 Mails.cppの関数は DisplayAddMailDialog
、ダイアログ ボックスを表示し、ダイアログ ボックスから関数に値を AddMail
渡します。 この関数は DisplayAddMailDialog
MAPI を使用したメール アイテムの作成とは直接関係しないため、ここには表示されません。 関数を AddMail
次に示します。
メソッドに渡される AddMail
lpFolder パラメーターは、新しいメッセージが作成されるフォルダーを表す IMAPIFolder インターフェイスへのポインターであることに注意してください。
IMAPIFolder インターフェイスを表す lpFolder パラメーターを指定すると、このコードは IMAPIFolder::CreateMessage メソッドを呼び出します。
CreateMessage メソッドは、成功コードと IMessage : IMAPIProp インターフェイスへのポインターへのポインターを返します。
ほとんどの関数コードは、AddMail
IMAPIProp::SetProps メソッドを呼び出す準備としてプロパティを設定する作業を処理します。
SetProps メソッドの呼び出しが成功すると、IMAPIProp::SaveChanges メソッドの呼び出しによってストアへの変更がコミットされ、新しいメール アイテムが作成されます。 その後、要求された場合は、メッセージを送信するために IMessage::SubmitMessage メソッドが呼び出されます。
関数はAddMail
、2 つのヘルパー関数を使用して、PR_CONVERSATION_INDEX プロパティと PR_REPORT_TAG プロパティの値をBuildConversationIndex
AddReportTag
構築します。 CreateOutlookItemsAddin.cppにある関数は BuildConversationIndex
、親会話インデックスが渡されない場合に、組み込みの MAPI ScCreateConversationIndex 関数と同じ動作をします。 これらの関数によって生成される会話インデックス バッファーの形式については、 PidTagConversationIndex Canonical プロパティに関するページを参照してください。
Mails.cppにある関数は AddReportTag
、 関数を 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;
}