Автоматическая обработка электронного письма на Java

Только что получил запрос от моего начальника на приложение, над которым я работаю. В основном мы настраиваем адрес электронной почты для внешнего клиента для отправки файлов Excel.

Мне нужен способ автоматически получать любое электронное письмо, отправленное на этот адрес, чтобы я мог взять вложение, обработать его и сохранить в папке.

Была бы полезна любая информация даже о том, с чего начать. \

Примечание: мы используем сервер Lotus Notes для этого, но общий способ был бы более полезным (если возможно).

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
6 154
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Электронная почта -> почтовый сервер -> [что-то] -> файл на диске.

Файл на диске довольно легко разобрать, используйте JavaMail.

[Что-то] может быть:

  • слушатель для smtp-соединений (излишество)!
  • Pop3 / imap клиент
  • Maildir / Почтовый ящик

Вы можете использовать JavaMail в качестве этого [чего-то], не так ли?

Adam Lerman 15.09.2008 20:16

Lotus Notes / Domino хранит почту в базе данных Notes. Доступны API-интерфейсы для получения документов (электронных писем), чтения значений полей (От, Тема) и отсоединения файлов.

API включают

-LotusScript (вариант VB, доступен в базе данных Notes)

-Java (изнутри или вне базы данных)

-C API (внешний)

-То же API, доступный через COM-сервер

Вы можете создать «запланированный агент» в базе данных (с помощью LotusScript или Java), который может находить документы, созданные с момента последнего запуска, находить вложения и извлекать их. Агент должен быть подписан с идентификатором, который имеет соответствующие разрешения на сервере, включая те, которые требуются для записи в файловую систему и запуска любых других процессов.

За пределами базы данных вы можете использовать любой API, кроме LotusScript, для входа в сервер / почтовую базу данных и следовать аналогичному процессу, например извлечение файлов локально на клиенте или отдельном сервере. C API и COM требуют установки клиента Notes, но приложения Java можно настроить для работы через CORBA / DIIOP без полной установки.

Обратитесь к справке Domino Designer (или на веб-сайте IBM для C API) для получения дополнительной информации.

Что касается «универсального способа» сделать это, если вы обращаетесь к данным в Notes и вам нужно извлекать вложения, я считаю, что эти API - ваш лучший вариант. Если вы планируете перенос приложения в другую почтовую систему, рассмотрите возможность разделения подпрограмм API через «интерфейс», поэтому вам нужно только добавить новую реализацию этого интерфейса для поддержки новой почтовой системы.

Вы можете относительно легко получить доступ к документам Notes с помощью DIIOP, это было бы намного проще, чем идти по пути C Api ...

В последнее время я немного поработал с Java-агентами на серверах Domino. Сервер Domino 8.5 поддерживает Java 6 и ее встроенные компоненты, поэтому кому-то с небольшим опытом разработки Domino не потребуется много времени, чтобы собрать агент, который запускается при поступлении новой почты. В LotusScript это еще проще, но для этого требуются более специализированные навыки, которые вам, вероятно, потребуется привлечь подрядчика.

Ограничение, с которым вы, вероятно, столкнетесь, касается извлеченного файла, вы можете легко разместить его в файловой структуре сервера Domino, но вы можете быть ограничены безопасностью ОС от размещения его на другом сервере.

Попробуйте POP3Client в Пакет Net Commons; это позволит вашей программе Java проверять наличие новой почты для конкретной учетной записи с любым интервалом, который вы хотите (каждые несколько минут? ежечасно?), и получать / удалять сообщения по желанию.

Используйте почту в базе данных (администратор Domino может настроить ее за вас, но она также есть в файле справки).

В этой базе данных вы можете создать агент, который периодически запускается для обработки всех новых документов. Этот агент будет использовать свойство EmbeddedObjects класса NotesRichTextItem и метод ExtractFile класса NotesEmbeddedObject, чтобы получить дескриптор прикрепленного файла и извлечь его в указанное вами место.

Например, этот сценарий просматривает все вложения файлов, ссылки на объекты и встроенные объекты в элементе Body документа. Каждый раз, когда он находит вложение файла, он отключает файл в каталог SAMPLES на диске C и удаляет вложение из документа.

Dim doc As NotesDocument
Dim rtitem As Variant
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
  Forall o In rtitem.EmbeddedObjects
    If ( o.Type = EMBED_ATTACHMENT ) Then
      Call o.ExtractFile( "c:\samples\" & o.Source )
      Call o.Remove
      Call doc.Save( False, True )
    End If
  End Forall
End If

SMTP / POP3 можно включить на сервере Domino. Работал с этим раньше и запустил Squirrel Mail. SMTP немного ресурсоемкий, но стоит затраченных усилий, потому что тогда вам не придется спускаться в LotusLand, чтобы все заработало. Просто напишите небольшую программу Java CLI, которая будет проверять конкретный почтовый ящик (POP3 или SMTP) и анализировать сообщения, извлекая вложения и размещая их там, где это необходимо.

Здесь много документации и примеров: http://java.sun.com/products/javamail/

Техники, которые вы разрабатываете, используя этот подход, будут более широко применимы в вашей будущей карьере, чем что-либо специфическое для Lotus / Domino.

Независимо от того, что вы делаете, вам потребуется понимание структур данных Lotus Notes. Хорошая новость заключается в том, что полностью автоматизированное решение может быть очень легко создано в Notes.

Лучше всего, чтобы он был встроен в Notes, и его можно было настроить для автоматического запуска при получении новой почты. Ответ Гэри точен, но без какого-либо опыта, вероятно, было бы сложно понять, как реализовать его самостоятельно. С другой стороны, грамотному программисту Notes не нужно больше часа или двух, чтобы его настроить.

Редактировать: с тех пор, как я впервые написал этот ответ, Wiser переехал и теперь утверждает, что является только инструментом для модульного тестирования, поэтому возьмите ответ ниже с долей скепсиса ...


Ответ Свриста хорош, но если вы хотите избежать его среднего шага (почтовый сервер, который записывает почту на диск для последующего получения системой Java), вы можете использовать Мудрее.

Wiser позволяет запустить почтовый сервер в Java:

Wiser wiser = new Wiser();
wiser.setPort(2500);
wiser.start();

Тогда вы можете просто периодически опрашивать его для почты:

for (WiserMessage message : wiser.getMessages())
{
    String envelopeSender = message.getEnvelopeSender();
    String envelopeReceiver = message.getEnvelopeReceiver();

    MimeMessage mess = message.getMimeMessage();

    // mail processing goes here
}

Другие вопросы по теме