Filtrar mensajes del servidor usando el cliente IMAP
El ImapClient class proporciona el listMessages() método que obtiene todos los mensajes de un buzón. Para obtener solo los mensajes que coincidan con alguna condición, use el sobrecargado listMessages() método que toma MailQuery como argumento. El MailQuery la clase proporciona varias propiedades para especificar las condiciones, por ejemplo, fecha, asunto, remitente, destinatario, etc. El primer ejemplo ilustra cómo filtrar mensajes basados en 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 brinda la capacidad de aplicar criterios de búsqueda sensibles a mayúsculas para coincidir exactamente con los criterios de filtrado. Además, la API permite especificar la codificación de la cadena de búsqueda para filtrar mensajes del buzón.
Filtrando Mensajes del Buzón
- Conectar e iniciar sesión en un servidor IMAP
- Cree una instancia de la MailQuery y establecer las propiedades
- Llame al ImapClient.listMessages(MailQuery query) método y pasar el MailQuery 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-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final 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.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
System.out.println("Imap: " + messages.size() + " message(s) found.");
// Disconnect from IMAP
client.dispose();
Obtener mensajes que cumplan criterios específicos
Los ejemplos de código anteriores filtrar mensajes basados en el asunto y la fecha del correo. También podemos usar otras propiedades para establecer otras condiciones compatibles. A continuación hay algunos ejemplos de cómo establecer condiciones usando MailQuery. Los fragmentos de código que siguen muestran cómo filtrar correos electrónicos en:
- 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 a la fecha de hoy.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
~~
### **Date Range*
The following code snippet shows you how to filter emails on the date range.
~~~Java
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived in last 7 days
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());
Remitente Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos a un remitente específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");
Dominio Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos a un dominio específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");
Destinatario Específico
El siguiente fragmento de código muestra cómo filtrar correos electrónicos a un destinatario específico.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails sent to specific recipient
builder.getTo().contains("recipient");
Construir consultas complejas
Si diferentes MailQueryBuilder las propiedades se establecen en declaraciones separadas, luego todas las condiciones se cumplirán. Por ejemplo, si queremos obtener mensajes entre un rango de fechas y de un host específico, necesitamos escribir tres declaraciones.
Combinar 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-Java
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.getFrom().contains("SpecificHost.com");
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());
Combinar consultas con OR
MailQueryBuilder proporciona el or() método que toma dos MailQuery instancias 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 tengan “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-Java
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));
Filtración por InternalDate
Los mensajes pueden extraerse del servidor basándose en InternalDate, sin embargo a veces el servidor no devuelve todos los mensajes visibles en la bandeja de entrada. La razón puede ser la zona horaria del servidor, ya que no siempre es UTC en 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 variar debido a la configuración de zona horaria del servidor. Se ha añadido un nuevo miembro en ImapMessageInfo como InternalDate lo que ayuda aún más a filtrar los 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-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final 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.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
for (ImapMessageInfo info : messages) {
System.out.println("Internal Date: " + info.getInternalDate());
}
// Disconnect from IMAP
client.dispose();
Filtrado de correos sensible a mayúsculas
El siguiente fragmento de código muestra cómo usar filtrado de correos sensible a mayúsculas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
Especificar codificación para el constructor de consultas
Los API ImapQueryBuilder el constructor puede usarse para especificar la codificación de la cadena de búsqueda. También puede establecerse usando el DefaultEncoding propiedad 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-Java
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Charset.forName("utf-8"));
builder.getSubject().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-Java
/// <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>
final ImapClient client = new ImapClient("host.domain.com", 84, "username", "password");
try {
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 - " + UUID.randomUUID(), "111111111111111");
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
String body = "2222222222222";
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), body);
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
client.selectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.getBody().contains(body);
MailQuery query = iqb.getQuery();
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection totalMessageInfoCol = client.listMessages(query);
System.out.println(totalMessageInfoCol.size());
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new ArrayList<ImapPageInfo>();
PageSettings ps = new PageSettings();
ps.setFolderName(ImapFolderInfo.IN_BOX);
PageInfo pi = new PageInfo(itemsPerPage);
ImapPageInfo pageInfo = client.listMessagesByPage(query, pi, ps);
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(query, pageInfo.getNextPage(), ps);
pages.add(pageInfo);
}
int retrievedItems = 0;
// foreach to while statements conversion
for (ImapPageInfo folderCol : pages) {
retrievedItems += folderCol.getItems().size();
}
} finally {
}
} finally {
if (client != null)
client.dispose();
}
Filtrar mensajes con bandera personalizada
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.hasFlags(ImapMessageFlags.keyword("custom1"));
queryBuilder.hasNoFlags(ImapMessageFlags.keyword("custom2"));
Filtrar mensajes usando búsqueda personalizada
Por ejemplo, el estándar RFC 3501 no permite buscar mensajes basados en la existencia de archivos adjuntos. Pero Gmail ofrece Extensiones IMAP que permiten realizar esa búsqueda. Aspose.Email proporciona el customSearch método del ImapQueryBuilder clase para realizar una consulta correspondiente.
El siguiente ejemplo de código muestra cómo recuperar una lista de mensajes de correo electrónico del servidor que tienen archivos adjuntos, usando el protocolo IMAP y un criterio de búsqueda personalizado:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);