Création d’un élément de courrier simple
S’applique à : Outlook 2013 | Outlook 2016
MAPI peut être utilisé pour créer et envoyer un message qui demande une confirmation de lecture. Lorsqu’un accusé de lecture est demandé, le système de messagerie génère et retourne un rapport de lecture à l’expéditeur lorsque le destinataire ouvre le message.
Pour plus d’informations sur le téléchargement, l’affichage et l’exécution du code à partir de l’application MFCMAPI et du projet CreateOutlookItemsAddin référencé dans cette rubrique, consultez Installer les exemples utilisés dans cette section.
Pour créer et envoyer un message demandant une confirmation de lecture
Créez un message sortant. Pour plus d’informations sur la création d’un message sortant, consultez Gestion d’un message sortant.
Ajoutez la propriété PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) et définissez-la sur true.
Ajoutez la propriété PR_CONVERSATION_INDEX (PidTagConversationIndex).
Ajoutez la propriété PR_REPORT_TAG (PidTagReportTag).
Envoyez le message en appelant la méthode IMessage ::SubmitMessage .
La AddMail
fonction dans le fichier source Mails.cpp du projet CreateOutlookItemsAddin illustre ces étapes. La AddMail
fonction prend les paramètres de la boîte de dialogue Ajouter un courrier qui s’affiche lorsque vous cliquez sur la commande Ajouter un courrier dans le menu Addins de l’exemple d’application MFCMAPI. La DisplayAddMailDialog
fonction dans Mails.cpp affiche la boîte de dialogue et transmet les valeurs de la boîte de dialogue à la AddMail
fonction. La DisplayAddMailDialog
fonction n’est pas directement liée à la création d’un élément de courrier à l’aide de MAPI. Elle n’est donc pas répertoriée ici. La AddMail
fonction est répertoriée ci-dessous.
Notez que le paramètre lpFolder passé à la AddMail
méthode est un pointeur vers une interface IMAPIFolder qui représente le dossier dans lequel le nouveau message sera créé. Étant donné le paramètre lpFolder qui représente une interface IMAPIFolder , le code appelle la méthode IMAPIFolder ::CreateMessage . La méthode CreateMessage retourne un code de réussite et un pointeur vers un pointeur vers une interface IMessage : IMAPIProp .
La plupart du code de fonction AddMail
gère le travail de définition des propriétés en préparation de l’appel de la méthode IMAPIProp ::SetProps . Si l’appel à la méthode SetProps réussit, un appel à la méthode IMAPIProp ::SaveChanges valide les modifications apportées au magasin et crée un nouvel élément de courrier. Ensuite, si elle est demandée, la méthode IMessage ::SubmitMessage est appelée pour envoyer le message.
La AddMail
fonction utilise deux fonctions d’assistance pour générer des valeurs pour les propriétés PR_CONVERSATION_INDEX et PR_REPORT_TAG : les BuildConversationIndex
fonctions et AddReportTag
. La BuildConversationIndex
fonction, située dans CreateOutlookItemsAddin.cpp, effectue le même travail que la fonction MAPI ScCreateConversationIndex intégrée lorsqu’aucun index de conversation parent ne lui est transmis. Le format de la mémoire tampon d’index de conversation que ces fonctions génèrent est documenté dans Propriété canonique PidTagConversationIndex.
La AddReportTag
fonction, située dans Mails.cpp, appelle à son tour la BuildReportTag
fonction pour générer une structure pour la propriété PR_REPORT_TAG . Pour plus d’informations sur la structure générée par la BuildReportTag
fonction, consultez Propriété canonique PidTagReportTag.
Voici la liste complète de la AddMail
fonction.
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;
}