Compartilhar via


Criar um item de email simples

Aplica-se a: Outlook 2013 | Outlook 2016

O MAPI pode ser usado para criar e enviar uma mensagem que solicita um recibo de leitura. Quando um recibo de leitura é solicitado, o sistema de mensagens gera e retorna um relatório de leitura ao remetente quando o destinatário abre a mensagem.

Para obter informações sobre como baixar, exibir e executar o código do aplicativo MFCMAPI e do projeto CreateOutlookItemsAddin referenciado neste tópico, consulte Instalar os exemplos usados nesta seção.

Para criar e enviar uma mensagem solicitando um recibo de leitura

  1. Crie uma mensagem de saída. Para obter informações sobre como criar uma mensagem de saída, consulte Manipulando uma mensagem de saída.

  2. Adicione a propriedade PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) e defina-a como true.

  3. Adicione a propriedade PR_CONVERSATION_INDEX (PidTagConversationIndex).

  4. Adicione a propriedade PR_REPORT_TAG (PidTagReportTag).

  5. Envie a mensagem chamando o método IMessage::SubmitMessage .

A AddMail função no arquivo de origem Mails.cpp do projeto CreateOutlookItemsAddin demonstra essas etapas. A AddMail função usa parâmetros da caixa de diálogo Adicionar Email exibida quando você clica no comando Adicionar Email no menu Addins no aplicativo de exemplo MFCMAPI. A DisplayAddMailDialog função em Mails.cpp exibe a caixa de diálogo e passa os valores da caixa de diálogo para a AddMail função. A DisplayAddMailDialog função não se relaciona diretamente com a criação de um item de email usando MAPI, portanto, ela não está listada aqui. A AddMail função está listada abaixo.

Observe que o parâmetro lpFolder passado para o AddMail método é um ponteiro para uma interface IMAPIFolder que representa a pasta em que a nova mensagem será criada. Dado o parâmetro lpFolder que representa uma interface IMAPIFolder , o código chama o método IMAPIFolder::CreateMessage . O método CreateMessage retorna um código de sucesso e um ponteiro para um ponteiro para uma interface IMessage : IMAPIProp .

A maioria do código de AddMail função manipula o trabalho de definir propriedades em preparação para chamar o método IMAPIProp::SetProps . Se a chamada para o método SetProps for bem-sucedida, uma chamada para o método IMAPIProp::SaveChanges confirmará as alterações no repositório e criará um novo item de email. Em seguida, se solicitado, o método IMessage::SubmitMessage é chamado para enviar a mensagem.

A AddMail função usa duas funções auxiliares para criar valores para as propriedades PR_CONVERSATION_INDEX e PR_REPORT_TAG : as BuildConversationIndex funções e AddReportTag . A BuildConversationIndex função, localizada em CreateOutlookItemsAddin.cpp, faz o mesmo trabalho que a função interna MAPI ScCreateConversationIndex faz quando um índice de conversa pai não é passado para ela. O formato do buffer de índice de conversa que essas funções geram está documentado na Propriedade Canônica PidTagConversationIndex.

A AddReportTag função, localizada em Mails.cpp, por sua vez chama a BuildReportTag função para criar uma estrutura para a propriedade PR_REPORT_TAG . Para obter informações sobre a estrutura que a BuildReportTag função cria, consulte Propriedade Canônica PidTagReportTag.

A seguir está a listagem completa da AddMail função.

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

Confira também