質問

私は、電子メール受信ボックスを入力キューとして使用するDeamonアプリケーションに取り組んでいます。応答時間は、サーバーのオーバーヘッドが最小限に抑えられているため、可能な限り高くする必要があるため、ポーリング電子メールの受信トレイは問題ありません。 IMAPプロトコルは新しい電子メールの通知を有効にするため、これはアプリケーションに最適です。

しかし、Delphi/Indyアプリケーションにこのメカニズムを実装しようとしたときに、トラブルに遭遇しました。 Tidimap4はうまく機能します(私の場合は無関係ないくつかのユニコードの問題は別として)が、通知を実装する方法を見つけることができませんでした。

これは単純なGIYFの問題であるはずですが、いくつかのTO-MEに知られていない理由で、オンラインで検索する際にIndyコンポーネントに関する関連情報を見つけることができません。

解決策または代替アプローチを深く感謝します。

編集:Indyは非同期電子メール通知をサポートしていないように見えるため、Delphiの無料コンポーネントがそれを可能にする人を誰でも知っています。

役に立ちましたか?

解決

Tidimap4は、新しい電子メールが通知するなど、非同期通知の受信をサポートしていません。 Tidtelnetが使用するものと同様のマルチスレッドモデルにTidimap4の実装を変更する必要がありますが、Tidimap4の現在のブロッキングコマンド/応答モデルのためにより複雑です。とりあえず、定期的に受信トレイを投票する必要があります。

他のヒント

クライアントの代わりに、アプリをSMTPサーバーにしてみませんか。

これにより、新しい電子メールを引く代わりに、電子メールがアプリに直接送信されるため、直接通知があります。

MS ExchangeやPostfixなどを非常にうまく機能させることができると確信していますが、アプリがダウンしている場合、電子メールはキューにならないという点で、いくつかのフォールバックがあります。

Ok。これは代替ソリューションです。電子メールを使用したい理由がないと仮定すると(たとえば、メールが電子メールを介して外部ソースが形成されている)、データベーステーブルは、入力キューを作成するためのはるかに簡単な方法であることをお勧めします。

定期的にデータベースを投票するだけです。これは、電子メールの受信トレイを投票するよりもはるかに速く、あなたが思っているよりもはるかに速くなります。データベースのポーリングは非常に高速であり、データベーステーブルを1分間に数百回簡単に投票することができ、パフォーマンスにはあまり大きな影響がありません。

テーブルを作成して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イベントや電子メールの受信トレイよりもはるかに複雑ではありません。

電子メールの受信トレイ(IMAP)がアーキテクチャに基本的な要件であり、IMAPクライアントが利用できない場合、別の言語で記述された非同期通知を持つIMAPクライアントを見つけようとします(c、c#、さらにはjava)プロキシまたはゲートウェイは、新しいメッセージが届くとDelphiデーモンアプリをトリガーします。

Delphi Daemonは、単純なソケットベースのプロトコルまたはHTTPを使用してメッセージを受信できます(Tidhttpserver、tidtcpclient)。

インディの学習曲線が急な場合は、自由でオープンソースのArarat Synapse TCP/IPライブラリでProtoypeを書くことができます。それは私のDelphi 2009アプリで非常にうまく機能します(コンパイラがいくつかの文字列/ANSIについて不平を言うことを除きます変換)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top