Cómo buscar elementos de Outlook por valor de encabezado de internet con una propiedad personalizada
🔍 WiseChecker

Cómo buscar elementos de Outlook por valor de encabezado de internet con una propiedad personalizada

Necesita encontrar un correo electrónico específico según un valor del encabezado de Internet, como un ID de seguimiento personalizado o una puntuación de spam. La búsqueda integrada de Outlook no permite buscar directamente dentro de los campos del encabezado de Internet. Este artículo explica cómo crear una propiedad personalizada en Outlook que extrae un valor del encabezado de Internet y luego usar esa propiedad para buscar y filtrar sus elementos.

El método utiliza VBA de Outlook para leer el texto del encabezado, analizar el valor de destino y almacenarlo en un campo definido por el usuario. Una vez que la propiedad personalizada está rellenada, puede buscarla con Búsqueda instantánea o crear una carpeta de búsqueda. Este enfoque funciona para cualquier campo de encabezado, incluidos X-Spam-Status, Received, Authentication-Results o encabezados X personalizados.

Aprenderá a escribir la macro de VBA, asignarla a un botón y aplicar la propiedad personalizada a sus criterios de búsqueda. No se requieren complementos de terceros.

Puntos clave: buscar por valor de encabezado de Internet en Outlook

  • Macro de VBA con PropertyAccessor.GetProperty: Lee la propiedad PR_TRANSPORT_MESSAGE_HEADERS para acceder al encabezado de Internet completo.
  • Campo definido por el usuario en la carpeta: Almacena el valor de encabezado extraído como un campo de texto personalizado que se puede buscar con Búsqueda instantánea.
  • Carpeta de búsqueda con criterios de propiedad personalizada: Recopila automáticamente todos los elementos que coinciden con un valor de encabezado específico sin escaneo manual.

ADVERTISEMENT

Cómo funcionan los encabezados de Internet y las propiedades personalizadas en Outlook

Cada correo electrónico contiene encabezados de Internet que registran información de enrutamiento, resultados de autenticación y metadatos personalizados agregados por los servidores de correo. Outlook almacena el encabezado completo en la propiedad MAPI PR_TRANSPORT_MESSAGE_HEADERS (nombre DASL: http://schemas.microsoft.com/mapi/proptag/0x007D001E). Esta propiedad no se expone en la interfaz predeterminada de Outlook.

Una propiedad personalizada, también llamada campo definido por el usuario, es un campo de texto que se agrega a una carpeta. Puede escribir datos en él mediante VBA y luego buscar ese campo con consultas de Búsqueda instantánea como custom_field_name:value. El campo reside en el esquema de la carpeta y persiste hasta que lo elimine. Cada elemento de la carpeta puede tener un valor diferente para el mismo campo personalizado.

Para buscar por valor de encabezado, necesita una macro que haga tres cosas:

  • Leer el encabezado completo de un correo electrónico seleccionado.
  • Analizar la línea de encabezado de destino y extraer el valor.
  • Escribir ese valor en una propiedad personalizada del mismo elemento.

Una vez que la propiedad personalizada está rellenada, puede buscar en toda la carpeta usando esa propiedad como criterio. Este método solo funciona en elementos que ya haya procesado con la macro. Para los correos electrónicos entrantes nuevos, puede ejecutar la macro automáticamente mediante el evento ItemAdd.

Pasos para crear una propiedad personalizada y buscar por valor de encabezado de Internet

Siga estos pasos para configurar la macro de VBA, crear el campo personalizado y ejecutar la extracción en sus correos electrónicos.

  1. Habilitar la pestaña Desarrollador
    Abra Outlook. Vaya a Archivo > Opciones > Personalizar cinta de opciones. En la columna derecha, marque la casilla Desarrollador y haga clic en Aceptar. La pestaña Desarrollador aparece en la cinta de opciones.
  2. Abrir el Editor de VBA
    Haga clic en la pestaña Desarrollador y luego en Visual Basic. Como alternativa, presione Alt+F11 en el teclado.
  3. Insertar un nuevo módulo
    En el editor de VBA, vaya a Insertar > Módulo. Se abre una ventana de código en blanco.
  4. Pegar el código de la macro
    Copie y pegue el siguiente código en la ventana del módulo. Reemplace X-Custom-Header con el nombre exacto del encabezado que desea buscar.
    Sub ExtractHeaderToCustomField()
        Dim olApp As Outlook.Application
        Dim olExp As Outlook.Explorer
        Dim olSel As Outlook.Selection
        Dim olMail As Outlook.MailItem
        Dim strHeader As String
        Dim strHeaderName As String
        Dim strValue As String
        Dim intPos As Integer
        Dim intEndPos As Integer
        
        Set olApp = Outlook.Application
        Set olExp = olApp.ActiveExplorer
        Set olSel = olExp.Selection
        
        ' Change this to the header you want to extract
        strHeaderName = "X-Custom-Header"
        
        If olSel.Count = 0 Then
            MsgBox "Select at least one email."
            Exit Sub
        End If
        
        For Each olMail In olSel
            ' Read the full internet header
            strHeader = olMail.PropertyAccessor.GetProperty(
                "http://schemas.microsoft.com/mapi/proptag/0x007D001E")
            
            ' Find the target header line
            intPos = InStr(1, strHeader, strHeaderName & ":", vbTextCompare)
            If intPos > 0 Then
                ' Get the start of the value (after ": ")
                intPos = intPos + Len(strHeaderName) + 2
                intEndPos = InStr(intPos, strHeader, vbCrLf)
                If intEndPos = 0 Then intEndPos = Len(strHeader) + 1
                strValue = Mid(strHeader, intPos, intEndPos - intPos)
                strValue = Trim(strValue)
                
                ' Write the value into a user-defined field
                olMail.UserProperties("HeaderValue") = strValue
                olMail.Save
            End If
        Next
        
        Set olMail = Nothing
        Set olSel = Nothing
        Set olExp = Nothing
        Set olApp = Nothing
        
        MsgBox "Done."
    End Sub
    
  5. Agregar el campo personalizado a la carpeta
    En Outlook, haga clic con el botón derecho en la carpeta que desea buscar (por ejemplo, Bandeja de entrada). Elija Propiedades. Vaya a la pestaña General y haga clic en el botón Nuevo en Campos disponibles en esta carpeta. Cree un nuevo campo de texto llamado HeaderValue y haga clic en Aceptar dos veces.
  6. Ejecutar la macro en los correos electrónicos seleccionados
    En Outlook, seleccione uno o varios correos electrónicos. Presione Alt+F8 para abrir el cuadro de diálogo Macros. Elija ExtractHeaderToCustomField y haga clic en Ejecutar. La macro lee el encabezado de cada correo electrónico, extrae el valor del encabezado especificado y lo escribe en el campo HeaderValue.
  7. Buscar usando la propiedad personalizada
    Haga clic dentro del cuadro de Búsqueda instantánea en la parte superior de la carpeta. Escriba HeaderValue:yourvalue reemplazando yourvalue con el valor real que desea encontrar. Outlook filtra la lista para mostrar solo los elementos en los que coincide el campo personalizado.

Automatizar la macro para correos electrónicos nuevos

Para ejecutar la extracción automáticamente cuando llega correo nuevo, use el evento Items.ItemAdd en VBA. Abra el editor de VBA, haga doble clic en ThisOutlookSession en el Explorador de proyectos y pegue el código a continuación. Reemplace Inbox con el nombre de su carpeta de destino si es necesario.

Private WithEvents olInboxItems As Outlook.Items

Private Sub Application_Startup()
    Dim olNS As Outlook.NameSpace
    Set olNS = Application.GetNamespace("MAPI")
    Set olInboxItems = olNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
    If TypeOf Item Is Outlook.MailItem Then
        Dim olMail As Outlook.MailItem
        Set olMail = Item
        ' Call the extraction subroutine
        Call ExtractHeaderToCustomFieldSingle(olMail)
    End If
End Sub

Sub ExtractHeaderToCustomFieldSingle(olMail As Outlook.MailItem)
    Dim strHeader As String
    Dim strHeaderName As String
    Dim strValue As String
    Dim intPos As Integer
    Dim intEndPos As Integer
    
    strHeaderName = "X-Custom-Header"
    
    On Error Resume Next
    strHeader = olMail.PropertyAccessor.GetProperty(
        "http://schemas.microsoft.com/mapi/proptag/0x007D001E")
    If Err.Number <> 0 Then Exit Sub
    
    intPos = InStr(1, strHeader, strHeaderName & ":", vbTextCompare)
    If intPos > 0 Then
        intPos = intPos + Len(strHeaderName) + 2
        intEndPos = InStr(intPos, strHeader, vbCrLf)
        If intEndPos = 0 Then intEndPos = Len(strHeader) + 1
        strValue = Mid(strHeader, intPos, intEndPos - intPos)
        strValue = Trim(strValue)
        
        olMail.UserProperties("HeaderValue") = strValue
        olMail.Save
    End If
End Sub

ADVERTISEMENT

Problemas comunes y limitaciones al buscar por valor de encabezado

La macro devuelve un error en algunos correos electrónicos

Algunos correos electrónicos, como las solicitudes de reunión, no tienen la propiedad PR_TRANSPORT_MESSAGE_HEADERS. Agregue una instrucción On Error Resume Next antes de la llamada a GetProperty para omitir esos elementos de forma controlada. La macro anterior ya incluye esto para la versión automatizada.

El campo personalizado no aparece en los resultados de búsqueda

La Búsqueda instantánea solo indexa los campos que existen en el esquema de la carpeta. Verifique que el nombre del campo sea exactamente HeaderValue y que lo haya agregado a la carpeta correcta. Si la carpeta está en un ámbito de búsqueda que excluye los campos personalizados, use Herramientas de búsqueda > Opciones de búsqueda > Opciones de indexación para reconstruir el índice.

El valor del encabezado contiene espacios o saltos de línea adicionales

Los encabezados pueden dividirse en varias líneas. La macro anterior extrae solo la primera línea del valor del encabezado. Para valores de varias líneas, modifique el bucle para concatenar las líneas que comienzan con un espacio o una tabulación. Un analizador robusto leería todo el bloque de encabezado entre el nombre del encabezado y el siguiente encabezado.

La búsqueda no encuentra el valor después de ejecutar la macro

La propiedad personalizada solo se rellena en los elementos procesados por la macro. Los elementos que no se seleccionaron o que no estaban en la carpeta de destino no tendrán el campo. Ejecute la macro en todos los elementos existentes de la carpeta o use el evento ItemAdd automatizado para el correo futuro.

Búsqueda instantánea vs. Carpeta de búsqueda: comparación de métodos

Elemento Consulta de Búsqueda instantánea Carpeta de búsqueda con propiedad personalizada
Esfuerzo de configuración Ninguno después de ejecutar la macro Crear una carpeta de búsqueda una vez
Actualizaciones en tiempo real No, debe volver a ejecutar la macro para elementos nuevos Sí, si la macro se ejecuta en ItemAdd
Sintaxis de consulta HeaderValue:value Búsqueda avanzada con criterios de campo personalizado
Vista persistente Temporal hasta que borre la búsqueda La carpeta permanece hasta que se elimina
Funciona con la indexación Sí, si el campo está indexado Sí, el mismo índice

Ahora puede extraer cualquier valor de encabezado de Internet en un campo personalizado de Outlook y buscar sus elementos usando ese valor. La macro de VBA le da control total sobre qué encabezado usar y a qué carpeta dirigirse. Para búsquedas recurrentes, configure una carpeta de búsqueda con el campo HeaderValue como criterio y habilite la automatización de ItemAdd para mantenerla actualizada.

Para ampliar este método, modifique la macro para extraer varios valores de encabezado en campos personalizados separados. También puede exportar los valores a una hoja de Excel usando VBA de Outlook y la propiedad Range.Value para un análisis posterior. El objeto PropertyAccessor puede leer muchas propiedades MAPI ocultas más allá de los encabezados, como el ID del mensaje o la dirección de respuesta.

ADVERTISEMENT