Filtrar Mensajes del Servidor usando Cliente IMAP
La clase ImapClient ofrece el método ListMessages() que obtiene todos los mensajes de un buzón. Para obtener solo los mensajes que coinciden con alguna condición, utiliza el método sobrecargado ListMessages() que toma MailQuery como argumento. La clase MailQuery proporciona varias propiedades para especificar las condiciones, por ejemplo, fecha, asunto, remitente, destinatario, etc. El primer ejemplo ilustra cómo filtrar mensajes según la fecha y el asunto. También mostramos cómo filtrar por otros criterios y cómo construir consultas más complejas. La API también proporciona la capacidad de aplicar criterios de búsqueda que son sensibles a mayúsculas y minúsculas para hacer coincidir criterios de filtrado exactos. La API también permite especificar la codificación de la cadena de búsqueda para filtrar mensajes del buzón.
Filtrar Mensajes del Buzón
- Conectar e iniciar sesión en un servidor IMAP
- Crear una instancia de MailQuery y establecer las propiedades
- Llamar al método
ImapClient.ListMessages(MailQuery query)
y pasar elMailQuery
con los parámetros para obtener solo los mensajes filtrados.
El siguiente fragmento de código muestra cómo conectarse a un buzón IMAP y obtener mensajes que llegaron hoy y tienen la palabra “newsletter” en el asunto.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Connect and log in to IMAP | |
const string host = "host"; | |
const int port = 143; | |
const string username = "user@host.com"; | |
const string password = "password"; | |
ImapClient client = new ImapClient(host, port, username, password); | |
client.SelectFolder("Inbox"); | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter"); | |
builder.InternalDate.On(DateTime.Now); | |
// Build the query and Get list of messages | |
MailQuery query = builder.GetQuery(); | |
ImapMessageInfoCollection messages = client.ListMessages(query); | |
Console.WriteLine("Imap: " + messages.Count + " message(s) found."); | |
// Disconnect from IMAP | |
client.Dispose(); |
Obtener Mensajes que Cumplen Criterios Específicos
Los ejemplos de código anteriores filtran mensajes en función del asunto y la fecha del correo electrónico. También podemos usar otras propiedades para establecer otras condiciones soportadas. A continuación se presentan algunos ejemplos de cómo establecer las condiciones utilizando MailQuery. Los siguientes fragmentos de código muestran cómo filtrar correos electrónicos en:
- La fecha de hoy.
- Un rango de fechas.
- De un remitente específico.
- De un dominio específico.
- De un destinatario específico.
Fecha de Hoy
El siguiente fragmento de código muestra cómo filtrar correos electrónicos en la Fecha de Hoy.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails that arrived today | |
MailQueryBuilder builder = new MailQueryBuilder(); | |
builder.InternalDate.On(DateTime.Now); |
Rango de Fechas
El siguiente fragmento de código muestra cómo filtrar correos electrónicos en el rango de fechas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails that arrived in last 7 days | |
builder.InternalDate.Before(DateTime.Now); | |
builder.InternalDate.Since(DateTime.Now.AddDays(-7)); |
Remitente Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos de un remitente específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails from specific sender | |
builder.From.Contains("saqib.razzaq@127.0.0.1"); |
Dominio Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos de un dominio específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails from specific domain | |
builder.From.Contains("SpecificHost.com"); |
Destinatario Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos de un destinatario específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Get emails sent to specific recipient | |
builder.To.Contains("recipient"); |
Construir Consultas Complejas
Si diferentes propiedades de MailQueryBuilder se establecen en declaraciones separadas, entonces todas las condiciones se igualarán. Por ejemplo, si queremos obtener mensajes entre un rango de fechas y de un host específico, necesitamos escribir tres declaraciones.
Combinando Consultas con AND
El siguiente fragmento de código muestra cómo combinar consultas con AND.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago | |
builder.From.Contains("SpecificHost.com"); | |
builder.InternalDate.Before(DateTime.Now); | |
builder.InternalDate.Since(DateTime.Now.AddDays(-7)); |
Combinando Consultas con OR
MailQueryBuilder proporciona el método Or() que toma dos instancias de MailQuery como parámetros. Obtiene los mensajes que coinciden con cualquiera de las dos condiciones especificadas. El siguiente fragmento de código muestra cómo filtrar mensajes que tienen “test” en el asunto o “noreply@host.com” como remitente. El siguiente fragmento de código muestra cómo combinar consultas con OR.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Specify OR condition | |
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com")); |
Filtración en InternalDate
Los mensajes se pueden extraer del servidor en función de la InternalDate, sin embargo, a veces el servidor no devuelve todos los mensajes como se ve en la bandeja de entrada. Su razón puede ser la zona horaria del servidor, ya que puede no ser UTC para todos los servidores como Gmail. Aspose envía comandos como 008 SEARCH ON 4-May-2014 de acuerdo con el protocolo IMAP, sin embargo, el resultado puede diferir debido a la configuración de la zona horaria del servidor. Se añade un nuevo miembro en ImapMessageInfo como InternalDate que ayuda además en la filtración de mensajes. El siguiente fragmento de código muestra el uso de InternalDate para filtrar mensajes.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Connect and log in to IMAP | |
const string host = "host"; | |
const int port = 143; | |
const string username = "user@host.com"; | |
const string password = "password"; | |
ImapClient client = new ImapClient(host, port, username, password); | |
client.SelectFolder("Inbox"); | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter"); | |
builder.InternalDate.On(DateTime.Now); | |
// Build the query and Get list of messages | |
MailQuery query = builder.GetQuery(); | |
ImapMessageInfoCollection messages = client.ListMessages(query); | |
foreach (ImapMessageInfo info in messages) | |
{ | |
Console.WriteLine("Internal Date: " + info.InternalDate); | |
} | |
// Disconnect from IMAP | |
client.Dispose(); |
Filtrado de Correos Electrónicos Sensible a Mayúsculas y Minúsculas
El siguiente fragmento de código muestra cómo utilizar el filtrado de correos electrónicos sensible a mayúsculas y minúsculas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Set conditions, Subject contains "Newsletter", Emails that arrived today | |
ImapQueryBuilder builder = new ImapQueryBuilder(); | |
builder.Subject.Contains("Newsletter", true); | |
builder.InternalDate.On(DateTime.Now); | |
MailQuery query = builder.GetQuery(); |
Especificar Codificación para el Constructor de Consultas
El constructor ImapQueryBuilder de la API se puede utilizar para especificar la codificación para la cadena de búsqueda. Esto también se puede establecer utilizando la propiedad DefaultEncoding del MailQueryBuilder. El siguiente fragmento de código muestra cómo especificar la codificación para el constructor de consultas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// Set conditions | |
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8); | |
builder.Subject.Contains("ğüşıöç", true); | |
MailQuery query = builder.GetQuery(); |
Filtrar Mensajes con Soporte de Paginación
El ImapClient proporciona la capacidad de buscar mensajes del buzón y listarlos con soporte de paginación. El siguiente fragmento de código muestra cómo filtrar mensajes con soporte de paginación.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
///<summary> | |
/// This example shows how to search for messages using ImapClient of the API with paging support | |
/// Introduced in Aspose.Email for .NET 6.4.0 | |
///</summary> | |
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password")) | |
{ | |
try | |
{ | |
// Append some test messages | |
int messagesNum = 12; | |
int itemsPerPage = 5; | |
MailMessage message = null; | |
for (int i = 0; i < messagesNum; i++) | |
{ | |
message = new MailMessage( | |
"from@domain.com", | |
"to@domain.com", | |
"EMAILNET-35128 - " + Guid.NewGuid(), | |
"111111111111111"); | |
client.AppendMessage(ImapFolderInfo.InBox, message); | |
} | |
string body = "2222222222222"; | |
for (int i = 0; i < messagesNum; i++) | |
{ | |
message = new MailMessage( | |
"from@domain.com", | |
"to@domain.com", | |
"EMAILNET-35128 - " + Guid.NewGuid(), | |
body); | |
client.AppendMessage(ImapFolderInfo.InBox, message); | |
} | |
client.SelectFolder("Inbox"); | |
ImapQueryBuilder iqb = new ImapQueryBuilder(); | |
iqb.Body.Contains(body); | |
MailQuery query = iqb.GetQuery(); | |
client.SelectFolder(ImapFolderInfo.InBox); | |
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query); | |
Console.WriteLine(totalMessageInfoCol.Count); | |
////////////////////////////////////////////////////// | |
List<ImapPageInfo> pages = new List<ImapPageInfo>(); | |
PageSettings pageSettings = new PageSettings(); | |
pageSettings.FolderName = ImapFolderInfo.InBox; | |
ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings); | |
pages.Add(pageInfo); | |
while (!pageInfo.LastPage) | |
{ | |
pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings); | |
pages.Add(pageInfo); | |
} | |
int retrievedItems = 0; | |
foreach (ImapPageInfo folderCol in pages) | |
retrievedItems += folderCol.Items.Count; | |
} | |
finally | |
{ | |
} | |
} |
Filtrar Mensajes con Bandera Personalizada
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
ImapQueryBuilder queryBuilder = new ImapQueryBuilder(); | |
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1")); | |
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2")); |
Filtrar Mensajes usando Búsquedas Personalizadas
Por ejemplo, el estándar RFC 3501 no permite buscar mensajes en función de la existencia de archivos adjuntos en los mensajes. Pero Gmail proporciona Extensiones IMAP que permiten realizar tal búsqueda. El siguiente fragmento de código muestra cómo hacer una consulta correspondiente.
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");
MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);