Filtrera meddelanden från servern med IMAP‑klient
Den ImapClient klass tillhandahåller listMessages() metod som hämtar alla meddelanden från en brevlåda. För att bara få meddelanden som matchar ett villkor, använd den överlagrade listMessages() metod som tar MailQuery som argument. MailQuery klassen tillhandahåller olika egenskaper för att specificera villkoren, t.ex. datum, ämne, avsändare, mottagare osv. Det första exemplet visar hur man filtrerar meddelanden baserat på datum och ämne. Vi visar också hur man filtrerar på andra kriterier och hur man bygger mer komplexa frågor. API:et ger även möjlighet att använda skiftlägeskänsliga sökkriterier för att matcha exakta filtreringskriterier. API:et möjliggör även att ange kodning för söksträngen vid filtrering av meddelanden från brevlådan.
Filtrering av meddelanden från brevlåda
- Anslut och logga in på en IMAP‑server
- Skapa en instans av MailQuery och ange egenskaperna
- Anropa ImapClient.listMessages(MailQuery query) metod och skicka MailQuery med parametrarna för att endast hämta filtrerade meddelanden.
Följande kodsnutt visar hur du ansluter till en IMAP‑brevlåda och hämtar meddelanden som anlände idag och har ordet "newsletter" i ämnet.
// 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();
Hämta meddelanden som uppfyller specifika kriterier
Kodexemplen ovan filtrera meddelanden baserat på e‑postens ämne och datum. Vi kan också använda andra egenskaper för att ange andra stödjade villkor. Nedan följer några exempel på hur man ställer in villkoren med hjälp av MailQuery. Följande kodsnuttar visar hur man filtrerar e‑post på:
- Dagens datum.
- Ett datumintervall.
- Från en specifik avsändare.
- Från en specifik domän.
- Från en specifik mottagare.
Dagens datum
Följande kodsnutt visar hur du filtrerar e‑post på dagens datum.
// 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());
Specifik avsändare
Följande kodsnutt visar hur du filtrerar e‑post på en specifik avsändare.
// 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");
Specifik domän
Följande kodsnutt visar hur du filtrerar e‑post på en specifik domän.
// 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");
Specifik mottagare
Följande kodsnutt visar hur du filtrerar e‑post på en specifik mottagare.
// 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");
Bygga komplexa frågor
Om olika MailQueryBuilder egenskaper sätts i separata satser, då matchas alla villkor. Till exempel, om vi vill hämta meddelanden inom ett datumintervall och från en specifik värd, måste vi skriva tre satser.
Kombinera frågor med AND
Följande kodsnutt visar hur man kombinerar frågor med 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());
Kombinera frågor med OR
MailQueryBuilder tillhandahåller or() metod som tar två MailQuery instanser som parametrar. Den hämtar meddelanden som matchar något av de två angivna villkoren. Följande kodsnutt visar hur man filtrerar meddelanden som antingen har "test" i ämnet eller "noreply@host.com" som avsändare. Följande kodsnutt visar hur du kombinerar frågor med 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"));
Filtrering på InternalDate
Meddelanden kan extraheras från servern baserat på InternalDate, men ibland returnerar servern inte alla meddelanden som syns i inkorgen. Anledningen kan vara serverns tidszon eftersom den kanske inte är UTC för alla servrar såsom Gmail. Aspose skickar kommandon som 008 SEARCH ON 4-May-2014 enligt IMAP‑protokollet men resultatet kan skilja sig åt på grund av serverns tidszonsinställningar. En ny medlem har lagts till i ImapMessageInfo som InternalDate vilket ytterligare hjälper till att filtrera meddelandena. Följande kodsnutt visar användning av InternalDate för att filtrera meddelanden.
// 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();
Skiftlägeskänslig e‑postfiltrering
Följande kodsnutt visar hur du använder skiftlägeskänslig e‑postfiltrering.
// 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();
Ange kodning för Query Builder
API:ets ImapQueryBuilder konstruktor kan användas för att ange kodning för söksträngen. Detta kan också ställas in med hjälp av DefaultEncoding egenskap hos MailQueryBuilder. Följande kodsnutt visar hur du specificerar kodning för query builder.
// 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();
Filtrera meddelanden med sidstöd
Den ImapClient ger möjlighet att söka efter meddelanden i brevlådan och lista dem med sidstöd. Följande kodsnutt visar hur man filtrerar meddelanden med sidstöd.
// 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();
}
Filtrera meddelanden med anpassad flagga
// 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"));
Filtrera meddelanden med anpassad sökning
Till exempel tillåter inte RFC 3501-standarden en meddelandesökning baserad på förekomst av bilagor i meddelanden. Men Gmail erbjuder IMAP‑tillägg som möjliggör att utföra en sådan sökning. Aspose.Email tillhandahåller customSearch metod för ImapQueryBuilder klass för att göra en motsvarande fråga.
Kodexemplet nedan visar hur man hämtar en lista med e‑postmeddelanden från servern som har bilagor, med hjälp av IMAP‑protokollet och ett anpassat sökkriterium:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);