1

クライアント サーバー アプリケーションに電子メール通知を追加する必要があります。

ユーザーがクライアント UI で特定のアクションを実行すると、通知が発生します。

サーバーで中間層またはサービスを実行している場合、その方法を想像できます。

1)「保留中の通知」でDBテーブルを作成するだけです

2) ユーザーが通知を生成するアクションを実行すると、テーブルにレコードが追加されます

3) サーバーサイド私は継続的にそれらのメールを送信しようとし、送信が成功したらテーブルからそれらを削除します

今はこれを行うことはできません。後でサービスを追加する計画がありますが、今のところ、迅速かつ汚い方法で行かなければなりません。

だからどういうわけか私が考えていたのは、次のようなものを実装することです:

1)クライアントで通知価値のあるイベントが発生すると、同じクライアント(私のexe)が通知を送信しようとします。失敗すると、通知が「保留中の通知」テーブルに記録されます(失敗は、インターネット接続がないか、他の問題)

2) 保留中の通知をチェックするために、任意のクライアント マシンから動作するタイマーを追加します。ある場合、クライアントは電子メールを送信しようとします (トランザクションを使用して、フィールドを「TryngToSendFromClientX」としてマークし、失敗した場合はそのフィールドを NULL にリセットします)。

このアプローチはうまくいくと思いますが、明らかな制限があります(障害後に誰もシステムにログインしない場合、通知は送信されません-サービスが「ダウン」した場合も同様です)。しかし、このアプローチについてコメントし、より良いアプローチを提案できますか?

追加のメモ (シナリオをよりよく理解するため):

a) 注: すべての通知は同じ電子メール アカウントから送信されます。

b) 電子メールの送信者を追跡する必要がない。

c) 現在サービスを作成する際の問題は、基本的に展開が非常に複雑になることと、サービスの状態を監視するためのツールを作成する必要があることです。将来的には行う予定ですが、現在ではありません。将来的には、(通知の送信だけでなく) サービスに機能を追加する予定があるため、その場合はサービスを作成する方が理にかなっています。

d) Indy コンポーネントと SMTP サーバーを使用して電子メールを送信します。

4

5 に答える 5

2

今すぐサービスを作成したくない場合は、説明したシナリオにとらわれていると思います。保留中のメッセージがまだあるのに、クライアントを起動するユーザーがもういないという問題を回避するためにできることはいくつかあります。

保留中のメッセージのみをチェックして送信を試みるコマンドライン ユーティリティ (または bepe4711 が提案するコマンドライン パラメータ) を追加できます。

このコマンドライン ユーティリティをレジストリの StartUp フォルダまたは Run キーに追加します。このようにして、ユーザーがアプリを起動しなくても、少なくともコンピューターの再起動時にメッセージが送信されます。

スケジュールされたタスクを追加して、このユーティリティを少なくとも 1 日に 1 回実行します。スケジュールされたタスクは、コードまたはインストーラーによって追加できます。

両方を実行すると、コンピューターを二度と起動しないユーザーの保留中のメッセージについてのみ心配する必要があります。

于 2010-06-24T07:59:56.363 に答える
1

私はあなたが説明したアプローチと非常によく似たことをします。メールを送信する代わりに、Web サービスを呼び出す必要があります。私のアプリケーションは複数のラップトップにインストールされていますが、それらは通常ネットワークに接続されていません。

アプリケーションで例外が発生すると、ユーザーのコメントやスクリーン ショットなど、さまざまな情報を収集します。次に、これを Web サービスに送信しようとします。万が一Webサービスが利用できなくなった場合。(つまり、インターネットに接続されていないか、Web サービスがダウンしています) 結果をディスク上のユーザー プロファイル (App_Data) ディレクトリにある XML ファイルに書き込みます。

大きな違いの 1 つは、サーバーが稼働しているかどうかを確認するためにポーリングしないことです。アプリケーションの起動時に再度送信しようとしました。

于 2010-06-24T09:52:30.653 に答える
1

おそらく、クライアントにパラメーターを追加して、保留中の通知を確認して送信するだけにすることができます。この後、それ自体を終了できます。ある種のサービスのように振る舞うだけです。

次に、クライアントをサーバーにインストールし、x 分ごとに起動します。

于 2010-06-24T07:40:01.453 に答える
0

Windows の最新バージョンでは、Windows タスク スケジューラをより多く使用しており、イベント (つまり、ネットワーク カードが接続されたとき) でタスクを起動できるようになりました。誰もログインしていない場合でも、保留中の通知を送信しようとする別のユーティリティを作成できます。

于 2010-06-24T10:51:22.367 に答える
0

両方のシステムが Windows で実行されている場合は、MS Message Queue を参照してください。常にオンラインであるとは限らないシステムに通知を送信するように設計されています。私は .Net でそれを行いました。実装された使いやすいクラスが既にあります。Delphiについてはわかりません。

于 2010-06-24T08:49:55.070 に答える