Подтвердить что ты не робот

Клиент IMAP в Java: API JavaMail или Apache Commons Net?

Мне нужно реализовать клиент IMAP в Java.

Какие преимущества имеют использование библиотеки Apache Commons Net? Является ли это реализацией надежной и гибкой?

Как мне обрабатывать возвращаемые значения, он всегда создает строки.

Например:

public static void main(String[] args) throws Exception {
    IMAPClient client = new IMAPClient();
    client.connect(SERVER);
    client.login(USERNAME, PASSWORD);
    client.select("INBOX");
    client.fetch("1", "body[header]");
}

и мы можем направить вывод в строку на

client.addProtocolCommandListener(new PrintCommandListener(System.out, true));

Но как я могу получить список папок в виде экземпляров папки вместо чистого вывода строки?

4b9b3361

Ответ 1

Рассказ: это зависит от ваших реальных потребностей.

Если ваш клиент в основном сосредоточен на отправке и чтении почты, API JavaMail является стандартным стандартным API высокого уровня, и будет намного проще создавать почту, добавлять заголовки и/или прикрепления.

С другой стороны, , если вы намереваетесь предложить все возможности протокола IMAP, библиотека Apache Commons Net более высокого уровня позволит более подробные операции, на стоимость более котельного табличного кода для простых операций.

Чтобы завершить этот ответ, вы не должны забывать Apache Commons Email, который согласно домашней странице проекта построен на верхней части Java Mail API, который он стремится упростить. Он намного ближе к JavaMail, чем к Commons Net.

Не зная больше того, что нужно делать, трудно дать более точный ответ...

Ответ 2

Посмотрите на Получить бесплатные письма от Gmail - API JavaMail + IMAP

Он закодирован с использованием JavaMail API, но, на мой взгляд, он имеет гораздо более простой интерфейс, чем библиотека сообщества Apache.

Если вы действительно хотите использовать библиотеку сообщества Apache, посмотрите на javadocs и посмотрите, какие другие параметры вы можете передать в .select().

Ответ 3

как я могу получить список папок в качестве экземпляров папки вместо чистого вывода строки?

Похоже, что apache IMAPClient - это низкоуровневая оболочка по протоколу IMAP, поэтому ничего интереснее, чем строки. Для API более высокого уровня вы можете заглянуть в библиотеку JavaMail:

Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore("imaps");
store.connect(this.host, this.userName, this.password);

// Get default folder
Folder folder = store.getDefaultFolder();

// Get any folder by name
Folder[] folderList = folder.list();

Ответ 4

Существуют современные альтернативы, которые я недавно проверил:

  1. Клиент Yahoo IMAP: поддерживает асинхронный ввод-вывод с использованием Java Futures, но имеет низкий уровень и может быть слишком сложным для простых случаев использования, таких как проверка новой почты.
  2. Email4J: простой в использовании высокоуровневый API, который использует Java Mail ниже, но еще не в центральном Maven, и большой PR все еще открыт (я использую форк)

Для локального тестирования я использую облегченное изображение docker-imap-devel.

Хорошее введение, рассматривающее кулисы протокола IMAP (полезное для отладки), можно найти в IMAP 101: Сеансы IMAP вручную.

Обновление: В конце концов, проще всего было использовать старые добрые javax.mail.imap API и Folder.open(), которые работали из коробки, следовало проверить это раньше… Также имеется экспериментальный IdleManager, который можно использовать для просмотра почтового ящика на наличие новых сообщений с помощью ExecutorService.