Localizar o histórico de download de mensagens de uma conta POP3
Este tópico descreve como um cliente de email pode acessar a propriedade PidTagAttachDataBinary para obter o histórico de download de mensagens para uma conta POP3.
Por que obter o histórico de download de mensagens?
O provedor de protocolo POP (Post Office Protocol) do Outlook permite aos usuários recuperarem e baixarem novas mensagens de email em seu dispositivo local e, posteriormente, manter ou excluir essas mensagens de email no servidor de email. Quando o cliente de email verifica se há novas mensagens para baixar, deve ser capaz de identificar e baixar somente as novas mensagens dessa Caixa de Entrada. O cliente de email faz isso, primeiramente, usando o comando UIDL (listagem de ID exclusiva) para obter um mapa de cada mensagem que já foi enviada para essa Caixa de Entrada com uma UID (identificação exclusiva). O cliente também obtém o histórico de download de mensagens para mensagens baixadas ou excluídas na caixa de entrada desse cliente. Usando o mapa de UID e o histórico de download de mensagens, o cliente pode identificar as mensagens ausentes do histórico como novas e baixá-las em seguida.
Para obter o histórico de download de mensagens da Caixa de Entrada:
Siga as etapas deste tópico para encontrar a propriedade PidTagAttachDataBinary, que contém o histórico em um BLOB (objeto grande binário) que segue um formato específico.
Continue com Analisar o histórico de download de mensagens de uma conta POP3, que descreve como analisar este BLOB para identificar mensagens baixadas ou excluídas dessa Caixa de Entrada.
Conheça os principais conceitos para localizar o histórico de download de mensagens
O histórico de downloads de mensagens da Caixa de Entrada é armazenado em uma propriedade MAPI binária, PidTagAttachDataBinary, em um anexo de uma mensagem oculta na Caixa de Entrada. A tabela 1 mostra os recursos para conceitos que ajudam a entender como localizar o histórico de download de mensagens.
Tabela 1. Principais conceitos
Título do artigo | Descrição |
---|---|
Pastas ocultas MAPI |
O MAPI permite que os clientes de email armazenem informações em pastas e mensagens ocultas. As pastas ocultas estão na parte associada das pastas MAPI e normalmente contêm informações que não são visíveis e nem manipuladas pelos usuários. Os clientes decidem o formato e o conteúdo a ser armazenado em mensagens e pastas ocultas. |
Mensagens MAPI |
O MAPI armazena mensagens em pastas, seja na subárvore IPM padrão, que é visível para os usuários do cliente, ou fora da subárvore e invisíveis aos usuários. As mensagens podem ter dados adicionais armazenados em um anexo, que pode estar no formato de um arquivo, de outra mensagem ou de um objeto OLE. No caso do histórico de download de mensagens, o histórico é armazenado na propriedade de uma mensagem anexada a outra mensagem oculta. |
Visão geral das propriedades de mensagens |
Quando um cliente armazena informações em uma mensagem, ele realmente armazena as informações nas propriedades da mensagem. O MAPI suporta muitas propriedades, algumas sempre existem e podem ser definidas pelos clientes, outras são opcionais e os clientes não esperam que estejam disponíveis ou definidas com valores válidos. O histórico de download de mensagens é armazenado na propriedade PidTagAttachDataBinary de um anexo da mensagem oculta. |
Perfis MAPI |
Ao fazer logon em uma sessão, o cliente de email seleciona um perfil que descreve os provedores e serviços a serem usados. Um perfil é dividido em seções que contêm propriedades. Especificamente, as propriedades PidTagSearchKey (PR_SEARCH_KEY) e PidTagProfileName (PR_PROFILE_NAME) sempre existem. Uma chave de pesquisa do perfil é única entre todos os perfis e é armazenada na seção de perfil identificada por MUID_PROFILE_INSTANCE (que é definida em MAPIGUID.H). Use IMAPISession::OpenProfileSection para abrir a seção e IMAPIProp::GetProps para obter os valores das propriedades. |
Tabelas de conteúdo |
Provedores de repositório de mensagens implementam tabelas de conteúdo às suas pastas. Para mensagens ocultas na parte associada de uma pasta, os provedores de repositório de mensagens suportam tabelas de conteúdo associadas e os clientes podem usar o método IMAPIContainer::GetContentsTable para retornar um apontador para a tabela de conteúdo associada. |
Sobre restrições Tipos de restrições Criar uma restrição Exemplo de código de restrição |
Em MAPI, os clientes podem usar restrições para filtrar tabelas de conteúdo a fim de procurar linhas que representam as mensagens que tenham uma determinada propriedade definidas como um valor específico. As restrições são definidas usando a estrutura de dados SRestriction, que pode conter uma união de estruturas de restrição mais especializadas. O método IMAPITable::FindRow aplica uma restrição e recupera a primeira linha em uma tabela que atende aos critérios de restrição. |
Sobre como registrar repositórios para indexação |
Use a propriedade PidTagStoreProvider (PR_MDB_PROVIDER) para verificar o tipo de provedor de repositório. Por exemplo, para verificar se um repositório é do Exchange, a propriedade PidTagStoreProvider deve retornar um valor representado pela constante pbExchangeProviderPrimaryUserGuid, que é definida no arquivo de cabeçalho público edkmdb.h. |
Localizar o anexo e a mensagem oculta apropriados
Agora que sabemos que o histórico de download de mensagens de uma Caixa de Entrada está na propriedade PidTagAttachDataBinary de um anexo de uma mensagem oculta, o procedimento para localizar o anexo apropriado da mensagem oculta apropriada envolve os seguintes procedimentos:
Localizar a mensagem oculta apropriada
Obtenha a propriedade PidTagSearchKey (PR_SEARCH_KEY) do perfil, na seção de perfil especificada por MUID_PROFILE_INSTANCE.
Abra os Conteúdos Associados na pasta da Caixa de Entrada chamando IMAPIContainer::GetContentsTable.
Crie uma restrição baseada nas propriedades PidTagConversationKey (PR_CONVERSATION_KEY), PidTagSearchKey (PR_SEARCH_KEY) e PidTagMessageClass (PR_MESSAGE_CLASS) para obter uma tabela que contém todas as mensagens ocultas nos Conteúdos Associados da Caixa de Entrada. A seguir apresentamos um exemplo de uma restrição extraída de Localizar o histórico de UIDL POP3.
SRestriction rgRes[3]; SPropValue rgProps[3]; rgRes[0].rt = RES_AND; rgRes[0].res.resAnd.cRes = 2; rgRes[0].res.resAnd.lpRes = &rgRes[1]; rgRes[1].rt = RES_PROPERTY; rgRes[1].res.resProperty.relop = RELOP_EQ; rgRes[1].res.resProperty.ulPropTag = PR_CONVERSATION_KEY; rgRes[1].res.resProperty.lpProp = &rgProps[0]; rgRes[2].rt = RES_PROPERTY; rgRes[2].res.resProperty.relop = RELOP_EQ; rgRes[2].res.resProperty.ulPropTag = PR_MESSAGE_CLASS; rgRes[2].res.resProperty.lpProp = &rgProps[1]; rgProps[0].ulPropTag = PR_CONVERSATION_KEY; rgProps[0].Value.bin = pVals[iSearchKey].Value.bin; // PR_SEARCH_KEY from the profile rgProps[1].ulPropTag = PR_MESSAGE_CLASS; rgProps[1].Value.LPSZ = (LPTSTR)"IPM.MessageManager";
Na tabela, encontre a mensagem oculta usando IMAPITable::FindRow.
Se a etapa 4 não conseguir localizar uma mensagem oculta, altere a restrição para usar PidTagSearchKey (PR_SEARCH_KEY) ao invés de PidTagConversationKey, conforme mostrado abaixo:
rgRes[1].res.resProperty.ulPropTag = rgProps[0].ulPropTag = PR_SEARCH_KEY;
Encontre a mensagem oculta usando IMAPITable::FindRow.
Se a Etapa 6 falhar, altere a restrição para usar PidTagSubject (PR_SUBJECT) sendo igual ao valor a seguir (mostrado abaixo usando
printf
substituição de estilo para brevidade)."Outlook Message Manager (%s) (KEY: %s)", PR_PROFILE_NAME, HexFromBin(PR_SEARCH_KEY)
Encontre a mensagem oculta usando IMAPITable::FindRow.
Se você estiver executando o Outlook 2010 ou posterior, use os seguintes valores para PidTagProfileName (PR_PROFILE_NAME) e PidTagSearchKey (PR _SEARCH_KEY), respectivamente.
CHAR g_szGeneralKey[] = "General Key"; const SBinary g_binGeneralKey = {sizeof(g_szGeneralKey), (LPBYTE)g_szGeneralKey};
Execute as etapas 3 a 8. Se isso não conseguir localizar uma mensagem, volte para as etapas originais 3 a 8.
Abra a mensagem oculta encontrada na etapa 4, 6 ou 8.
Localizar o anexo apropriado da mensagem oculta
Como a mensagem oculta pode conter mais de um anexo, procure o anexo apropriado na seguinte ordem.
Observação
Este procedimento usa novamente a printf
substituição de estilo para brevidade.
Procure um anexo cujo PidTagAttachLongFilename (PR_ATTACH_LONG_FILENAME) corresponda à cadeia de caracteres a seguir, em que
szEmailAddress
é o endereço SMTP do usuário, conforme especificado no perfil do usuário. ."BlobPOP%s", szEmailAddress
Procure um anexo cujo PidTagAttachFilename (PR_ATTACH_FILENAME) corresponda a "BlobPOP%s",
szEmailAddress
.Procure um anexo cujo PidTagDisplayName (PR_DISPLAY_NAME) corresponda a "BlobPOP%s",
szEmailAddress
.Procure um anexo cujo PidTagAttachFilename (PR_ATTACH_FILENAME) corresponda a "Blob%.8x",
dwAcctUID
, de ondedwAcctUID
vem PROP_ACCT_MINI_UID. Você pode usar o método IOlkAccount::GetProp para acessar a propriedade PROP_ACCT_MINI_UID.
Acessar a propriedade PidTagAttachDataBinary do anexo da mensagem
Após localizar o anexo de mensagem apropriado da mensagem oculta, use IMAPIProp::GetProps para ler a propriedade PidTagAttachDataBinary do anexo.
Próximas etapas
Você aprendeu neste tópico a localizar o histórico de download de mensagens na Caixa de Entrada de um cliente de email POP3. Consulte Analisar o histórico de download de mensagens de uma conta POP3 para aprender como analisar este histórico a fim de identificar mensagens baixadas ou excluídas da Caixa de Entrada.