Compartir a través de


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

  1. Cree un mensaje saliente. Para obtener información sobre cómo crear un mensaje saliente, vea Control de un mensaje saliente.

  2. Agregue la propiedad PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) y establézcala en true.

  3. Agregue la propiedad PR_CONVERSATION_INDEX (PidTagConversationIndex).

  4. Agregue la propiedad PR_REPORT_TAG (PidTagReportTag).

  5. 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;
}

Vea también