Crear un elemento de correo simple
Hace referencia a: Outlook 2013 | Outlook 2016
MAPI se puede usar para crear y enviar un mensaje que solicite un recibo de lectura. Cuando se solicita un recibo de lectura, el sistema de mensajería genera y devuelve un informe de lectura al remitente cuando el destinatario abre el mensaje.
Para obtener información sobre cómo descargar, ver y ejecutar el código desde la aplicación MFCMAPI y el proyecto CreateOutlookItemsAddin al que se hace referencia en este tema, vea Instalar los ejemplos usados en esta sección.
Para crear y enviar un mensaje que solicita un recibo de lectura
Cree un mensaje saliente. Para obtener información sobre cómo crear un mensaje saliente, vea Control de un mensaje saliente.
Agregue la propiedad PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) y establézcala en true.
Agregue la propiedad PR_CONVERSATION_INDEX (PidTagConversationIndex).
Agregue la propiedad PR_REPORT_TAG (PidTagReportTag).
Envíe el mensaje llamando al método IMessage::SubmitMessage .
La AddMail
función del archivo de origen Mails.cpp del proyecto CreateOutlookItemsAddin muestra estos pasos. La AddMail
función toma parámetros del cuadro de diálogo Agregar correo que se muestra al hacer clic en el comando Agregar correo en el menú Complementos de la aplicación de ejemplo MFCMAPI. La DisplayAddMailDialog
función de Mails.cpp muestra el cuadro de diálogo y pasa los valores del cuadro de diálogo a la AddMail
función. La DisplayAddMailDialog
función no se relaciona directamente con la creación de un elemento de correo mediante MAPI, por lo que no aparece aquí. La AddMail
función se muestra a continuación.
Tenga en cuenta que el parámetro lpFolder pasado al AddMail
método es un puntero a una interfaz IMAPIFolder que representa la carpeta donde se creará el nuevo mensaje. Dado el parámetro lpFolder que representa una interfaz IMAPIFolder , el código llama al método IMAPIFolder::CreateMessage . El método CreateMessage devuelve un código correcto y un puntero a un puntero a una interfaz IMessage : IMAPIProp .
La mayoría del código de AddMail
función controla el trabajo de establecer propiedades como preparación para llamar al método IMAPIProp::SetProps . Si la llamada al método SetProps se realiza correctamente, una llamada al método IMAPIProp::SaveChanges confirma los cambios en el almacén y crea un nuevo elemento de correo. A continuación, si se solicita, se llama al método IMessage::SubmitMessage para enviar el mensaje.
La AddMail
función usa dos funciones auxiliares para compilar valores para las propiedades PR_CONVERSATION_INDEX y PR_REPORT_TAG : las BuildConversationIndex
funciones y AddReportTag
. La BuildConversationIndex
función, ubicada en CreateOutlookItemsAddin.cpp, realiza el mismo trabajo que la función integrada SCCreateConversationIndex de MAPI cuando no se le pasa un índice de conversación primario. El formato del búfer de índice de conversación que generan estas funciones se documenta en PidTagConversationIndex Canonical Property.
La AddReportTag
función, ubicada en Mails.cpp, a su vez llama a la BuildReportTag
función para crear una estructura para la propiedad PR_REPORT_TAG . Para obtener información sobre la estructura que compila la BuildReportTag
función, vea Propiedad canónica PidTagReportTag.
A continuación se muestra la lista completa de la AddMail
función.
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;
}