Buscar el historial de descarga de mensajes de una cuenta POP3
En este tema se describe cómo un cliente de correo puede acceder a la propiedad PidTagAttachDataBinary para obtener el historial de descarga de mensajes de una cuenta POP3.
¿Por qué obtener el historial de descarga de mensajes?
El proveedor de protocolo de oficina de correos (POP) para Outlook permite a los usuarios recuperar y descargar nuevos mensajes de correo electrónico en su dispositivo local y, posteriormente, dejar o eliminar estos mensajes de correo electrónico en el servidor de correo. Cuando el cliente de correo comprueba si hay nuevos mensajes que descargar, tiene que poder identificar y descargar solo los nuevos mensajes de esa Bandeja de entrada. El cliente de correo lo hace primero mediante el comando UIDL (Lista de identificadores únicos), que obtiene un mapa de cada mensaje que se haya entregado alguna vez a esa Bandeja de entrada a un identificador único (UID). El cliente también obtiene el historial de descarga de mensajes de los mensajes que se han descargado o eliminado para la Bandeja de entrada de ese cliente. Con el mapa del UID del mensaje y el historial de descarga, el cliente puede identificar los mensajes que están ausentes en el historial como nuevos y, por lo tanto, se deben descargar.
Para obtener el historial de descarga de mensajes de una bandeja de entrada:
Siga los pasos de este tema para buscar la propiedad PidTagAttachDataBinary , que contiene el historial de un objeto binario grande (BLOB) que sigue un formato específico.
Continúe con el análisis del historial de descarga de mensajes para una cuenta POP3, que describe cómo analizar este BLOB para identificar los mensajes que se han descargado o eliminado para esa bandeja de entrada.
Conceptos básicos que debe conocer para localizar el historial de descarga de mensajes
El historial de descarga de mensajes de una Bandeja de entrada se almacena en una propiedad MAPI binaria, PidTagAttachDataBinary, en un archivo adjunto de un mensaje oculto en la Bandeja de entrada. En la tabla 1 se muestran recursos para conceptos que le ayudarán a comprender cómo localizar el historial de descarga de mensajes.
Tabla 1. Conceptos básicos
Título del artículo | Descripción |
---|---|
Carpetas ocultas MAPI |
MAPI permite a los clientes de correo almacenar información en carpetas ocultas y mensajes ocultos. Las carpetas ocultas se encuentran en la parte asociada de las carpetas MAPI y normalmente contienen información que no es visible para los usuarios y que no deben manipularse. Los clientes deciden el formato y el contenido que se almacenarán en mensajes ocultos en carpetas ocultas. |
Mensajes MAPI |
MAPI almacena mensajes en carpetas, ya sea en el subárbol IPM estándar que es visible para los usuarios de un cliente o fuera del subárbol e invisible para los usuarios. Los mensajes pueden tener datos adicionales almacenados en datos adjuntos, que pueden estar en forma de archivo, otro mensaje o un objeto OLE. En el caso del historial de descarga de mensajes, el historial se almacena en una propiedad de un mensaje que se adjunta a otro mensaje oculto. |
Información general sobre las propiedades del mensaje |
Cuando un cliente almacena información en un mensaje, realmente almacena la información en una propiedad del mensaje. MAPI admite muchas propiedades(algunas siempre existen y pueden establecerse por los clientes, otras son opcionales) y los clientes no pueden esperar que estén disponibles o establecidas en valores válidos. El historial de descarga de mensajes se almacena en la propiedad PidTagAttachDataBinary de un archivo adjunto a un mensaje oculto. |
Perfiles MAPI |
En el momento del inicio de sesión en una sesión, el cliente de correo selecciona un perfil que describe los proveedores y servicios que se van a usar. Un perfil se divide en secciones que contienen propiedades. En concreto, las propiedades PidTagSearchKey (PR_SEARCH_KEY) y PidTagProfileName (PR_PROFILE_NAME) siempre existen. La clave de búsqueda de un perfil es única entre todos los perfiles y se almacena en la sección de perfil identificada por MUID_PROFILE_INSTANCE (que se define en MAPIGUID. H). Use IMAPISession::OpenProfileSection para abrir la sección y usar IMAPIProp::GetProps para obtener los valores de propiedad. |
Tablas de contenido |
Los proveedores de almacén de mensajes implementan tablas de contenido para sus carpetas. Para los mensajes ocultos en la parte asociada de una carpeta, los proveedores de almacén de mensajes admiten tablas de contenido asociadas y los clientes pueden usar el método IMAPIContainer::GetContentsTable para devolver un puntero a la tabla de contenido asociada. |
Acerca de las restricciones Tipos de restricciones Creación de una restricción Código de restricción de ejemplo |
En MAPI, los clientes pueden usar restricciones para filtrar tablas de contenido, para buscar filas que representen mensajes que tengan una propiedad determinada establecida en un valor específico. Las restricciones se definen mediante la estructura de datos SRestriction , que puede contener una unión de estructuras de restricciones más especializadas. El método IMAPITable::FindRow aplica una restricción y recupera la primera fila de una tabla que coincide con los criterios de restricción. |
Acerca del registro de almacenes para indexación |
Use la propiedad PidTagStoreProvider (PR_MDB_PROVIDER) para comprobar el tipo de proveedor de almacén. Por ejemplo, para comprobar si un almacén es un almacén de Exchange, la propiedad PidTagStoreProvider debe devolver un valor representado por la constante pbExchangeProviderPrimaryUserGuid, que se define en el archivo de encabezado público edkmdb.h. |
Buscar el mensaje oculto y los datos adjuntos adecuados
Ahora que sabemos que el historial de descarga de mensajes de una bandeja de entrada está en la propiedad PidTagAttachDataBinary de un archivo adjunto a un mensaje oculto, el procedimiento para localizar los datos adjuntos adecuados del mensaje oculto adecuado implica los procedimientos siguientes:
Búsqueda del mensaje oculto adecuado
Obtenga la propiedad PidTagSearchKey (PR_SEARCH_KEY) del perfil, en la sección de perfil especificada por MUID_PROFILE_INSTANCE.
Abra el contenido asociado de la carpeta Bandeja de entrada llamando a IMAPIContainer::GetContentsTable.
Cree una restricción basada en las propiedades PidTagConversationKey (PR_CONVERSATION_KEY), PidTagSearchKey (PR_SEARCH_KEY) y PidTagMessageClass (PR_MESSAGE_CLASS) para obtener una tabla que contenga todos los mensajes ocultos en el contenido asociado de la Bandeja de entrada. A continuación se muestra un ejemplo de una restricción extraída de Localizar el historial de UIDL de 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";
En la tabla, busque el mensaje oculto mediante IMAPITable::FindRow.
Si el paso 4 no encuentra un mensaje oculto, cambie la restricción para usar PidTagSearchKey (PR_SEARCH_KEY) en lugar de PidTagConversationKey, como se muestra a continuación:
rgRes[1].res.resProperty.ulPropTag = rgProps[0].ulPropTag = PR_SEARCH_KEY;
Busque el mensaje oculto mediante IMAPITable::FindRow.
Si se produce un error en el paso 6, cambie la restricción para usar PidTagSubject (PR_SUBJECT) que sea igual al valor siguiente (que se muestra a continuación mediante
printf
la sustitución de estilo para mayor brevedad)."Outlook Message Manager (%s) (KEY: %s)", PR_PROFILE_NAME, HexFromBin(PR_SEARCH_KEY)
Busque el mensaje oculto mediante IMAPITable::FindRow.
Si ejecuta Outlook 2010 o una versión posterior, use los siguientes valores para PidTagProfileName (PR_PROFILE_NAME) y PidTagSearchKey (PR_SEARCH_KEY), respectivamente.
CHAR g_szGeneralKey[] = "General Key"; const SBinary g_binGeneralKey = {sizeof(g_szGeneralKey), (LPBYTE)g_szGeneralKey};
Siga los pasos del 3 al 8. Si no encuentra un mensaje, vuelva a los pasos originales del 3 al 8.
Abra el mensaje oculto que se encuentra en los pasos 4, 6 u 8.
Buscar los datos adjuntos adecuados del mensaje oculto
Dado que el mensaje oculto puede tener más de un archivo adjunto, busque los datos adjuntos adecuados en el orden siguiente.
Nota:
Este procedimiento usa de nuevo la sustitución de printf
estilos para la brevedad.
Busque un archivo adjunto cuyo PidTagAttachLongFilename (PR_ATTACH_LONG_FILENAME) coincida con la siguiente cadena, donde
szEmailAddress
es la dirección SMTP del usuario, como se especifica en el perfil del usuario. ."BlobPOP%s", szEmailAddress
Busque un archivo adjunto cuyo PidTagAttachFilename (PR_ATTACH_FILENAME) coincida con "BlobPOP%s",
szEmailAddress
.Busque datos adjuntos cuyo PidTagDisplayName (PR_DISPLAY_NAME) coincida con "BlobPOP%s",
szEmailAddress
.Busque un archivo adjunto cuyo PidTagAttachFilename (PR_ATTACH_FILENAME) coincida con "Blob%.8x",
dwAcctUID
dondedwAcctUID
procede de PROP_ACCT_MINI_UID. Puede usar el método IOlkAccount::GetProp para acceder a la propiedad PROP_ACCT_MINI_UID .
Acceso a la propiedad PidTagAttachDataBinary de los datos adjuntos del mensaje
Después de buscar los datos adjuntos de mensaje adecuados del mensaje oculto, use IMAPIProp::GetProps para leer la propiedad PidTagAttachDataBinary de los datos adjuntos.
Pasos siguientes
En este tema ha aprendido a buscar el historial de descarga de mensajes de la Bandeja de entrada de un cliente de correo POP3. Consulte Análisis del historial de descarga de mensajes de una cuenta POP3 para obtener información sobre cómo analizar este historial para identificar los mensajes que se han descargado o eliminado para la Bandeja de entrada.