IMAPフォルダー/メッセージ同期戦略?
-
03-07-2019 - |
質問
Webアプリケーション(ASP.NET / SQL Server)の1つに IMAPメール統合を追加しようとしています。最も重要なIMAP機能を公開する商用ライブラリを既に使用しています。フォルダリストの取得、メッセージヘッダーの取得、MIMEメッセージの取得など)
電子メールデータの取得" live&quot ;; IMAPサーバーからは非常にうまく機能します。しかし、ここで難しいタスクが発生します。電子メール/フォルダーを IMAPサーバーと同期するSQLデータベースをキャッシュする(異なる基準を適用したデータを表示する必要があります)。
データベーススキーマには、基本的に" Folders"が含まれています。および「メール」表。 「メール」テーブルには、主に「FromAddress」、「FromName」、「IsRead」、「IsAnswered」、「IsForwarded」、「HasAttachments」などのヘッダー情報が含まれています。など(電子メールのコンテンツや添付ファイルなしでなし)。
2つの主要なシナリオを検討する必要があります:
- すべてのメッセージを初めて取得する(またはユーザーがフォルダを再編成した後)
- 新しい/最近のメッセージを取得する
パフォーマンスが主要な設計基準であることを考慮して、メールサーバーとデータベースサーバーを最新の状態に保つための適切な同期戦略は何でしょうか(接続するたびに何千ものメッセージを照会/比較することはできませんユーザーが古いメールを移動または削除したかどうかを確認するための命令です。)
ありがとう!
解決
ライブラリの機能リストから:
UniqueIdサポートの改善:追加しました リクエストのためのさらに多くのオプション メッセージの一意のID。いまなら可能です メッセージのUniqueIdを返します IMAPへの往復旅行のDataTable サーバー。
そして:
- 新しいメッセージのみを取得する
- フラグ付きメッセージの検索
- メッセージを既読にする/マーク解除する
あなたのライブラリには、SQLサーバーの同期を維持するために必要なすべてのサポートがあるように見えます。プログラムでメッセージに既読のマークを付けることができ、ライブラリは新しいメッセージのみの取得をサポートします。これで2番目のアイテムが処理されます。
戦略は、ソリューションの機能に一部依存します。質問を正しく読んだ場合、ユーザーはIMAPサーバーでメールを管理しており、SQL Serverは「購読済み」です。同期化の観点から、IMAPサーバーへ。
これが正しい場合、同期は事実上バックグラウンドタスクです。私のアプローチは、ユーザーごとにイベントモデルを使用して同期することです。可能であれば、「通知」ユーザーのアクティビティ(新規/削除された電子メール)がある場合の同期プログラム。同期" job"を追加します同期ジョブをまとめてバッチ処理するバックグラウンドプロセスに。通知モデルにより、同期プログラムが同期を必要とするユーザーでのみ機能することが保証されます。
新しい/削除された小さな電子メール同期ジョブは、1つの「プロセッサー」に移動します。完全な再同期やフォルダーの再編成などのより大きなジョブは別のジョブに移動します。全体のスループットを高く保つために、本当に大きな再同期ジョブを分割する必要がある場合があります。 「小さな仕事」および「大仕事」プロセッサは、パフォーマンスと設計上の考慮事項に応じて、2つの異なるサービス、または場合によっては2つの異なるスレッドにすることができます。