Фільтрація повідомлень з поштової скриньки Exchange
Фільтрація повідомлень за допомогою EWS
The IEWSClient class надає listMessages() метод, який отримує всі повідомлення зі скриньки. Щоб отримати лише повідомлення, які відповідають певній умові, використайте перевантажений listMessages() метод, який приймає MailQuery клас як аргумент. The MailQuery клас надає різні властивості для вказання умов, наприклад, дата, тема, відправник та одержувач. Крім того, API дозволяє застосовувати фільтри чутливості до регістру при отриманні електронних листів зі скриньки.
Фільтрація повідомлень
Щоб отримати відфільтровані повідомлення зі скриньки:
- Підключіться до сервера Exchange.
- Створіть екземпляр MailQuery і встановіть потрібні властивості.
- Викличте метод IEWSClient.listMessages() і передайте MailQuery у параметрах, щоб отримати лише відфільтровані повідомлення.
Наступний фрагмент коду показує, як підключитися до IMAP‑поштової скриньки та отримати повідомлення, у темі яких є рядок "Newsletter" і які були надіслані сьогодні.
try {
// Connect to EWS
final String mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
final String username = "username";
final String password = "password";
final String domain = "domain";
IEWSClient client = EWSClient.getEWSClient(mailboxUri, username, password, domain);
// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
// Set Subject and Emails that arrived today
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
// Get list of messages
ExchangeMessageInfoCollection messages = client.listMessages(client.getMailboxInfo().getInboxUri(), query, false);
System.out.println("EWS: " + messages.size() + " message(s) found.");
// Disconnect from EWS
client.dispose();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
Фільтрація повідомлень за критеріями
Вище подані зразки коду фільтрують повідомлення за темою листа та датою. Ми можемо фільтрувати й за іншими властивостями. Нижче наведено кілька прикладів встановлення умов за допомогою MailQuery.
Фільтрація повідомлень за сьогоднішньою датою
Наступний фрагмент коду показує, як фільтрувати всі електронні листи за сьогоднішньою датою.
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
Фільтрація повідомлень за діапазоном дат
Наступний фрагмент коду показує, як відфільтрувати всі листи за діапазоном дат.
// 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());
Фільтрація повідомлень за конкретним відправником
Наступний фрагмент коду показує, як відфільтрувати всі листи за конкретним відправником.
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");
Фільтрація повідомлень за конкретним доменом
Наступний фрагмент коду показує, як відфільтрувати всі листи за конкретним доменом.
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");
Фільтрація повідомлень за конкретним одержувачем
Наступний фрагмент коду показує, як відфільтрувати всі листи за конкретним одержувачем.
// Get emails sent to specific recipient
builder.getTo().contains("recipient");
Фільтрація повідомлень за MessageID
Наступний фрагмент коду показує, як відфільтрувати всі листи за MessageID.
// Get email with specific MessageId
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getMessageId().equals("MessageID");
Фільтрація повідомлень за всіма сповіщеннями про доставку пошти
Наступний фрагмент коду показує, як відфільтрувати всі листи за всіма повідомленнями про доставку пошти.
// Get Mail Delivery Notifications
builder = new ExchangeQueryBuilder();
builder.getContentClass().equals(ContentClassType.getMDN().toString());
Фільтрація повідомлень за розміром
builder = new ExchangeQueryBuilder();
builder.getItemSize().greater(80000);
Фільтрація повідомлень за строковим значенням
Наступний фрагмент коду показує, як фільтрувати всі електронні листи за вказаним рядком у заголовках (тема, від, до, копія). getText() метод повертає рядкове значення разом з вмістом повідомлення.
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getText().equals("SomeText");
MailQuery query = builder.getQuery();
ExchangeMessageInfoCollection messages = ewsClient.listMessages("InboxUri", query, false);
Фільтрація повідомлень у зростаючому/спадному порядку
Aspose.Email надає ComparisonField.orderBy(boolean ascending) метод, який встановлює значення, що вказує, чи клієнт використовує сортування за зростанням або спаданням у полі пошуку. Він дозволяє сортувати повідомлення електронної пошти у порядку зростання/спадання на підставі критеріїв, зазначених MailQueryBuilder.
Наведений нижче фрагмент коду демонструє, як фільтрувати повідомлення у порядку зростання/спадання:
MailQueryBuilder builder = new MailQueryBuilder();
builder.getSubject().contains("Report");
builder.getInternalDate().since(sinceDate);
builder.getSubject().orderBy(true); // sort the subject ascending
builder.getInternalDate().orderBy(false); // sort the date descending
ExchangeMessageInfoCollection miColl = client.listMessages(client.getMailboxInfo().getInboxUri(), builder.getQuery());
Створення складних запитів
Якщо різні MailQueryBuilder властивості встановлюються окремим виразом, і всі умови збігаються. Наприклад, щоб отримати повідомлення за певним діапазоном дат і з конкретного хоста, напишіть три вирази:
Комбінування запитів за допомогою AND
Наступний фрагмент коду показує, як комбінувати запити за допомогою AND.
// 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());
Комбінування запитів за допомогою OR
MailQueryBuilder надає or() метод, який приймає два MailQuery екземпляри як параметри. Він отримує повідомлення, які відповідають будь-якій з двох зазначених умов. Наведений нижче приклад фільтрує повідомлення, у темі яких є слово "test" або відправником є "noreply@host.com". Наступний фрагмент коду показує, як комбінувати запити за допомогою OR.
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));
Фільтрація електронних листів з урахуванням регістру
Електронні листи можна фільтрувати з урахуванням регістру, вказавши прапорець IgnoreCase у критерії фільтрації, як показано у наведеному фрагменті коду.
// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
Фільтрація повідомлень з підтримкою пагінації
int itemsPerPage = 5;
String sGuid = UUID.randomUUID().toString();
String str1 = sGuid + " - " + "Query 1";
String str2 = sGuid + " - " + "Query 2";
MailQueryBuilder queryBuilder1 = new MailQueryBuilder();
queryBuilder1.getSubject().contains(str1);
MailQuery query1 = queryBuilder1.getQuery();
List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage);
pages.add(pageInfo);
int str1Count = pageInfo.getItems().size();
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage, pageInfo.getPageOffset() + 1);
pages.add(pageInfo);
str1Count += pageInfo.getItems().size();
}