2010-07-01 79 views
4

我正在使用電子郵件收件箱作爲其輸入隊列的deamon應用程序。響應時間應該儘可能地高,服務器開銷保持在最低限度,因此輪詢電子郵件收件箱是沒有問題的。隨着IMAP協議啓用新電子郵件的通知,這對於應用程序而言是理想的。使用Indy IMAP客戶端(Delphi 2009)發送電子郵件到達通知

但是,當我嘗試在Delphi/Indy應用程序中實現此機制時遇到了麻煩。 TIdIMAP4的效果很好(除了一些與我無關的Unicode問題),但我找不到在其中實現通知的方式。

這應該是一個簡單的GIYF問題,但由於某些原因未知的原因,我在網上搜索時找不到有關Indy組件的任何相關信息。

一個解決方案或替代方法將深受讚賞。

編輯:由於Indy顯然不支持異步電子郵件通知,有沒有人知道delphi的免費組件會啓用它。

回答

4

TIdIMAP4不支持接收異步通知,例如新電子郵件通知。這需要將TIdIMAP4的實現更改爲類似於TIdTelnet所用的多線程模型,但由於TIdIMAP4的當前阻塞命令/響應模型而更復雜。目前,您必須定期輪詢收件箱。

+1

你知道還有其他的Delphi IMAP客戶端組件嗎? – Tibor 2010-07-02 08:08:56

+0

我不會,對不起。 – 2010-07-02 19:13:22

0

好的。這是一個替代解決方案。假設你沒有理由使用電子郵件(例如你的信息是通過電子郵件從外部來源獲得的),那麼我建議數據庫表是建立輸入隊列的更直接的方式。

只需定期輪詢數據庫。這比查詢電子郵件收件箱要快得多,而且比你想象的要快得多。輪詢數據庫速度非常快,您可以輕鬆輪詢數據庫表,每分鐘數百次,對性能影響很小。

只需創建一個表來存儲您的問與答項目,並添加您可以存儲一個時間戳或標誌,這個問答項目已被處理的額外字段,那麼你只需要下一個未處理的項目從堆棧

如 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事件和電子郵件收件箱複雜得多。

+1

我們一直在考慮這一點,但由於輸入來自各種人類用戶,首先是電子郵件形式,數據庫將是一個不必要的中間步驟。 – Tibor 2010-07-02 07:07:03

+1

有數據庫也實現隊列(Oracle)。他們負責併發處理(你的代碼不會,兩個進程在處理之前可以得到相同的記錄)。還有數據庫可以讓你將事件發送給客戶端(再次,Oracle),而不需要連續輪詢表。 否則有純消息隊列。 – 2010-07-02 07:45:21

2

爲什麼不將該應用程序設爲smtp服務器,而不是客戶端。

這種方式你有直接通知,因爲電子郵件直接發送到你的應用程序,而不是拉動新的電子郵件。

有一些回退,如果你的應用程序關閉,那麼電子郵件將不會排隊,儘管我確信ms exchange或postfix等可以設置得很好。

0

如果電子郵件收件箱(IMAP)是您的架構中的基本要求,並且沒有可用的IMAP客戶端,我會嘗試使用其他語言(C,C#或甚至Java)編寫的異步通知來查找IMAP客戶端,實現一個'代理'或網關,然後在新消息到達時觸發你的Delphi守護進程應用程序。

Delphi守護進程可以使用一個簡單的基於套接字的協議或http接收消息(TIdHTTPServer,TIdTCPClient)。

如果Indy的學習曲線陡峭,可以使用Ararat Synapse TCP/IP庫編寫一個原型,它是免費且開源的,它在我的Delphi 2009應用程序中運行良好(除了編譯器抱怨一些字符串/ ansi轉換)。

相關問題