Уведомление о прибытии по электронной почте с клиентом Indy IMAP (Delphi 2009) - PullRequest
4 голосов
/ 02 июля 2010

Я работаю над приложением deamon, которое использует почтовый ящик в качестве входной очереди.Время отклика должно быть как можно выше, а нагрузка на сервер должна быть минимальной, так что опрос почтовых ящиков невозможен.Поскольку протокол IMAP позволяет получать уведомления о новых сообщениях электронной почты, это идеально подходит для приложения.

Однако у меня возникли проблемы, когда я попытался реализовать этот механизм в своем приложении Delphi / Indy.TIdIMAP4 прекрасно работает (за исключением некоторых проблем с Unicode, которые не имеют отношения к моему случаю), но я не смог найти способ реализовать в нем уведомления.

Это должно быть простой проблемой GIYF, но для некоторыхПо неизвестной причине я не могу найти ЛЮБУЮ соответствующую информацию о компонентах Indy при поиске в Интернете.

Решение или альтернативные подходы будут высоко оценены.

Редактировать: Так как Indy, очевидно, не поддерживает асинхронную электронную почтууведомления, кто-нибудь знает, какие бесплатные компоненты для Delphi позволят это.

Ответы [ 4 ]

4 голосов
/ 02 июля 2010

TIdIMAP4 не поддерживает получение асинхронных уведомлений, таких как уведомления о новых электронных письмах. Это потребует изменения реализации TIdIMAP4 на многопоточную модель, аналогичную используемой TIdTelnet, но более сложную из-за текущей модели команд / ответов блокировки TIdIMAP4. На данный момент вы должны периодически опрашивать входящие.

2 голосов
/ 02 июля 2010

Почему бы не сделать приложение сервером smtp вместо клиента.

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

Есть несколько откатов: электронная почта не будет помещаться в очередь, если ваше приложение не работает, хотя я уверен, что ms exchange, postfix и т. Д. Могут быть настроены для работы с ним достаточно хорошо.

0 голосов
/ 06 июля 2010

Если почтовый ящик (IMAP) является базовым требованием в вашей архитектуре и нет доступных клиентов IMAP, я бы попытался найти клиента IMAP с асинхронным уведомлением, написанным на другом языке (C, C # или даже Java), чтобыреализовать 'прокси' или шлюз, который будет запускать ваше приложение-демон Delphi при поступлении новых сообщений.

Демон Delphi может использовать простой протокол на основе сокетов или http для получения сообщений (TIdHTTPServer, TIdTCPClient).

Если кривая изучения Indy слишком велика, вы можете написать прототип с библиотекой Ararat Synapse TCP / IP, которая является бесплатной и с открытым исходным кодом, она очень хорошо работает в моих приложениях Delphi 2009 (за исключением того, что компилятор жалуется нанекоторые преобразования строки / анси).

0 голосов
/ 02 июля 2010

Хорошо. Это альтернативное решение. Предполагая, что нет причин, по которым вы хотите использовать электронную почту (например, ваша информация поступает из внешнего источника по электронной почте), я бы посоветовал использовать таблицу базы данных как более простой способ создания очереди ввода.

Просто опрашивайте базу данных на регулярной основе. Это будет намного, намного быстрее, чем опрос почтового ящика, и гораздо быстрее, чем вы думаете. Опрос базы данных очень быстрый, и вы можете легко опрашивать таблицу базы данных несколько сотен раз в минуту, практически не оказывая заметного влияния на производительность.

Просто создайте таблицу для хранения ваших элементов Q и добавьте дополнительное поле, в котором вы можете сохранить метку времени или отметить, что этот элемент q был обработан, затем вы просто снимаете следующий необработанный элемент со стека.

например, MSSQL

select Top 1 * from tbl_MyQ where AlreadyHandled = 0 

MySQL

select  * from tbl_MyQ where AlreadyHandled = 0 Limit 1

тогда

update tbl_MyQ Set AlreadyHandled = 1 where QueueID = #ItemIDRetrieved#

Базы данных быстрые, запустите тест, если вас беспокоит. И они намного менее сложны, чем IMAP-события и почтовые ящики.

...