Filtra i messaggi dal server usando il client IMAP
Il ImapClient classe fornisce il listMessages() metodo che ottiene tutti i messaggi da una casella di posta. Per ottenere solo i messaggi che corrispondono a una condizione, usa il sovraccaricato listMessages() metodo che prende MailQuery come argomento. Il MailQuery la classe fornisce varie proprietà per specificare le condizioni, ad esempio data, oggetto, mittente, destinatario e così via. Il primo esempio illustra come filtrare i messaggi in base a data e oggetto. Mostriamo anche come filtrare su altri criteri e come costruire query più complesse. L’API fornisce inoltre la capacità di applicare criteri di ricerca sensibili al maiuscolo/minuscolo per corrispondere esattamente ai criteri di filtraggio. L’API consente anche di specificare la codifica della stringa di ricerca per filtrare i messaggi dalla casella di posta.
Filtrare i messaggi dalla casella di posta
- Connetti e accedi a un server IMAP
- Crea un’istanza di MailQuery e impostare le proprietà
- Chiama il ImapClient.listMessages(MailQuery query) metodo e passa il MailQuery con i parametri per ottenere solo i messaggi filtrati.
Il seguente frammento di codice mostra come connettersi a una casella IMAP e ottenere i messaggi arrivati oggi e che hanno la parola "newsletter" nell’oggetto.
// 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();
Ottieni Messaggi che Soddisfano Criteri Specifici
I campioni di codice sopra filtrare i messaggi in base all’oggetto dell’email e alla data. Possiamo usare altre proprietà per impostare altre condizioni supportate. Di seguito alcuni esempi di impostazione delle condizioni usando MailQuery. I frammenti di codice seguenti mostrano come filtrare le email su:
- La data di oggi.
- Un intervallo di date.
- Da un mittente specifico.
- Da un dominio specifico.
- Da un destinatario specifico.
Data di oggi
Il seguente frammento di codice mostra come filtrare le email sulla data di oggi.
// 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());
Mittente specifico
Il seguente frammento di codice mostra come filtrare le email su un mittente specifico.
// 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 specifico
Il seguente frammento di codice mostra come filtrare le email su un dominio specifico.
// 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 specifico
Il seguente frammento di codice mostra come filtrare le email su un destinatario specifico.
// 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");
Costruire Query Complesse
Se diversi MailQueryBuilder le proprietà sono impostate in istruzioni separate, quindi tutte le condizioni verrebbero soddisfatte. Ad esempio, se desideriamo ottenere messaggi tra un intervallo di date e da un host specifico, dobbiamo scrivere tre istruzioni.
Combinare Query con AND
Il seguente frammento di codice mostra come combinare query 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());
Combinare Query con OR
MailQueryBuilder fornisce il or() metodo che prende due MailQuery istanze come parametri. Ottiene i messaggi che corrispondono a una delle due condizioni specificate. Il seguente frammento di codice mostra come filtrare i messaggi che hanno “test” nell’oggetto o “noreply@host.com” come mittente. Il seguente frammento di codice mostra come combinare query 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"));
Filtraggio su InternalDate
I messaggi possono essere estratti dal server basandosi su InternalDate, tuttavia a volte il server non restituisce tutti i messaggi visibili nella casella di posta. Il motivo può essere il fuso orario del server perché potrebbe non essere UTC per tutti i server come Gmail. Aspose invia comandi come 008 SEARCH ON 4-May-2014 secondo il protocollo IMAP tuttavia il risultato può differire a causa delle impostazioni del fuso orario del server. È stato aggiunto un nuovo membro in ImapMessageInfo come InternalDate che aiuta ulteriormente a filtrare i messaggi. Il seguente frammento di codice mostra l’uso di InternalDate per filtrare i messaggi.
// 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();
Filtro Email Sensibile al Maiuscolo/Minuscolo
Il seguente frammento di codice mostra come utilizzare il filtro di email sensibile al maiuscolo/minuscolo.
// 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();
Specifica la Codifica per il Costruttore di Query
Le API ImapQueryBuilder il costruttore può essere usato per specificare la codifica per la stringa di ricerca. Questo può anche essere impostato usando il DefaultEncoding proprietà del MailQueryBuilder. Il seguente frammento di codice mostra come specificare la codifica per il costruttore di query.
// 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();
Filtra i Messaggi con Supporto alla Paginazione
Il ImapClient fornisce la capacità di cercare messaggi dalla casella di posta e elencarli con supporto alla paginazione. Il seguente frammento di codice mostra come filtrare i messaggi con supporto alla paginazione.
// 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();
}
Filtra i Messaggi con Flag Personalizzato
// 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"));
Filtra i Messaggi usando la Ricerca Personalizzata
Ad esempio, lo standard RFC 3501 non consente la ricerca di messaggi basata sulla presenza di allegati nei messaggi. Ma Gmail offre Estensioni IMAP che consentono di eseguire tale ricerca. Aspose.Email fornisce il customSearch metodo del ImapQueryBuilder classe per effettuare una query corrispondente.
Il campione di codice seguente mostra come recuperare un elenco di messaggi email dal server che hanno allegati, usando il protocollo IMAP e un criterio di ricerca personalizzato:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);