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
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.
Adicione a propriedade PR_READ_RECEIPT_REQUESTED (PidTagReadReceiptRequested) e defina-a como true.
Adicione a propriedade PR_CONVERSATION_INDEX (PidTagConversationIndex).
Adicione a propriedade PR_REPORT_TAG (PidTagReportTag).
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;
}