Только что получил запрос от моего начальника на приложение, над которым я работаю. В основном мы настраиваем адрес электронной почты для внешнего клиента для отправки файлов Excel.
Мне нужен способ автоматически получать любое электронное письмо, отправленное на этот адрес, чтобы я мог взять вложение, обработать его и сохранить в папке.
Была бы полезна любая информация даже о том, с чего начать. \
Примечание: мы используем сервер Lotus Notes для этого, но общий способ был бы более полезным (если возможно).




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
}
Вы можете использовать JavaMail в качестве этого [чего-то], не так ли?