Buscar y filtrar correos IMAP en Python

Para recuperar todos los mensajes de un buzón, Aspose.Email proporciona el método ’list_messages’ de la ImapClient clase. Para obtener solo los mensajes que cumplen condiciones específicas, puede usar el método sobrecargado ’list_messages’ que acepta un MailQuery como argumento. El MailQuery clase ofrece varias propiedades para definir estas condiciones, como fecha, asunto, remitente y destinatario.

El primer ejemplo de código demuestra cómo filtrar mensajes basándose tanto en la fecha como en el asunto. Otros ejemplos muestran el filtrado por otros criterios y la construcción de consultas más complejas. Además, la API admite criterios de búsqueda sensibles a mayúsculas para un filtrado preciso y permite especificar la codificación de la cadena de búsqueda al filtrar mensajes del buzón.

Filtrar y obtener mensajes del servidor IMAP

Crear una consulta IMAP simple

Utilice el siguiente fragmento de código para conectarse a un buzón IMAP y obtener los mensajes que llegaron hoy y que tienen la palabra "newsletter" en el asunto.

  1. Conéctese al servidor IMAP usando el puerto 993 con el nombre de usuario y la contraseña.
  2. Seleccione la carpeta "Inbox" para trabajar con los correos entrantes.
  3. Cree una instancia de ImapQueryBuilder para construir una consulta de búsqueda.
  4. Especifique los criterios de búsqueda, por ejemplo, que el asunto de los correos contenga "Newsletter" y que la fecha interna coincida con la fecha de hoy.
  5. Genere la consulta de búsqueda recuperándola del generador.
  6. Utilice la consulta para listar los mensajes que cumplen los criterios.
  7. Imprimir el número total de mensajes que coinciden con los criterios de búsqueda.

Crear criterios de búsqueda complejos

Aspose.Email también permite crear criterios de búsqueda complejos para consultar y filtrar mensajes de correo electrónico, como fecha de entrega, dentro de un rango, remitente específico, dominio específico o destinatario específico. Para este propósito, use el MailQueryBuilder clase y sus propiedades. Los ejemplos de código a continuación le mostrarán cómo obtener mensajes por criterios específicos.

Filtrar correos electrónicos por la fecha de hoy

Para obtener mensajes por una fecha de entrega, use la propiedad ‘internal_date’ de la MailQueryBuilder clase como se muestra en el ejemplo de código a continuación:

import aspose.email as ae
from datetime import datetime

builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.on(datetime.now())

Filtrar correos electrónicos por rango de fechas

Para obtener mensajes dentro de un rango de fechas, use la misma propiedad ‘internal_date’ especificando el rango de fechas como se muestra en el siguiente ejemplo de código:

import aspose.email as ae
from datetime import datetime, timedelta

builder = ae.tools.search.MailQueryBuilder()
# Emails that arrived in last 7 days
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))

Filtrar correos electrónicos por remitente específico

Para obtener mensajes de un remitente específico, use la propiedad ‘from_address’ de la MailQueryBuilder clase como se muestra en el ejemplo de código a continuación:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("saqib.razzaq@127.0.0.1")

Filtrar correos por dominio específico

Para obtener mensajes de un dominio específico, use la propiedad ‘from_address’ como se muestra en el siguiente ejemplo de código:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("SpecificHost.com")

Filtrar correos por destinatario específico

Para obtener mensajes dirigidos a un destinatario específico, use la propiedad ’to’ como se muestra en el siguiente ejemplo de código:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.to.contains("recipient")

Filtrar mensajes por fecha interna

Construya una consulta sobre condiciones especificadas como "fecha interna" y "asunto contiene". La "fecha interna" se refiere a la fecha y hora en que un mensaje de correo fue recibido o añadido al servidor de correo y puede establecerse usando la propiedad ‘internal_date’ de la ImapQueryBuilder clase. El ejemplo de código a continuación demuestra cómo obtener correos específicos de una bandeja de entrada basándose en criterios de asunto y fecha:

import aspose.email as ae
from datetime import datetime

client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd")
client.select_folder("Inbox")

# Set conditions, Subject contains "Newsletter", Emails that arrived today
builder = ae.clients.imap.ImapQueryBuilder()
builder.subject.contains("Newsletter")
builder.internal_date.on(datetime.now())

# Build the query and Get list of messages
query = builder.get_query()
messages = client.list_messages(query)
for info in messages:
    print(f"Internal Date: {info.internal_date}")

Filtrar mensajes por indicadores de palabras clave personalizadas

Cree una consulta para buscar en un buzón IMAP correos que contengan indicadores de palabras clave personalizadas, específicamente "custom1" y "custom2". Para construir la consulta, use el ImapQueryBuilder clase que filtra correos al recuperarlos de un servidor IMAP.

Para comenzar, cree una instancia del generador de consultas. Usando el has_flags método, agregue condiciones para incluir solo los correos que poseen los indicadores de palabras clave IMAP especificados. Las palabras clave personalizadas en IMAP, también llamadas indicadores definidos por el usuario, permiten etiquetar o categorizar correos para diversos propósitos, como marcar su estado.

El siguiente fragmento de código ilustra cómo crear una consulta para recuperar correos basados en indicadores de palabras clave personalizadas:


builder = ae.clients.imap.ImapQueryBuilder()
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom1"))
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom2"))

Construir consultas complejas

A veces es necesario satisfacer más de una consulta. Aspose.Email lo posibilita combinando consultas en varias sentencias. Cree una MailQueryBuilder objeto y usar sus propiedades para construir consultas específicas.

Combinar consultas con AND

El siguiente fragmento de código muestra cómo combinar consultas con AND.

import aspose.email as ae
from datetime import datetime, timedelta

builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))
builder.from_address.contains("SpecificHost.com")

Combinar consultas con OR

El siguiente fragmento de código le muestra cómo combinar consultas con OR.


builder.either(builder.subject.contains("test"), builder.from_address.contains("noreply@host.com"))

Aplicando Filtros Sensibles a Mayúsculas

La API también brinda la capacidad de filtrar correos del buzón basándose en criterios sensibles a mayúsculas/minúsculas. Los siguientes métodos de la StringComparisonField clase que brinda la capacidad de buscar correos especificando indicadores sensibles a mayúsculas/minúsculas.

  • StringComparisonField.contains(value, ignore_case)
  • StringComparisonField.equals(value, ignore_case)
  • StringComparisonField.not_contains(value, ignore_case)
  • StringComparisonField.not_equals(value, ignore_case)

El siguiente fragmento de código le muestra cómo implementar esta capacidad en su proyecto:


builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("noreply@host.com", True)

Realizar consultas de búsqueda personalizadas

Cree una consulta de búsqueda para un buzón IMAP que filtre correos basándose en un criterio de búsqueda de Gmail personalizado — específicamente, correos que tengan archivos adjuntos.

Comience creando una instancia de ImapQueryBuilder, que ayuda a crear consultas de búsqueda IMAP complejas. Use el custom_search método para agregar una cadena de búsqueda específica de Gmail al generador de consultas.

La cadena de búsqueda X-GM-RAW "has:attachment" aprovecha el atributo IMAP extendido de Gmail X-GM-RAW, permitiendo el uso de la potente sintaxis de búsqueda web de Gmail dentro de consultas IMAP. Aquí, el operador has:attachment devuelve todos los correos que contienen archivos adjuntos.

El siguiente fragmento de código demuestra cómo filtrar correos para obtener todos los mensajes con archivos adjuntos:


builder = ae.clients.imap.ImapQueryBuilder()
builder.custom_search("X-GM-RAW \"has:attachment\"")

mailQuery = builder.get_query()

Este método habilita filtrado avanzado específico de Gmail para obtener correos dirigidos.