3

ユーザーが予定を作成し、予定を確認する電子メールを即座に受け取るアプリケーションを作成しています。また、予約日にメールを送信して、実際に来るように促したいと思います.

私は MS SQL で ASP.NET (2.0) を使用しています。即時の電子メールは問題ありませんが、リマインダー電子メールに対処する最善の方法がわかりません。基本的に、私は3つのアプローチを考えることができます:

  1. 毎晩実行される SQL ジョブを設定し、その日に予定のある人に SQL メールを送信します。
  2. どうにかして「前に配信しない」フラグを付けてメールを送信しますが、これは私が発明しているように思えます。
  3. 毎晩特定の時間に実行される別のアプリケーションを作成します。

明らかな何かが欠けていますか?どうすればこれを達成できますか?

4

8 に答える 8

8

選択肢 #1 が最適です。送信するメールのテーブルを作成し、各メールを送信するたびにテーブルを更新します。また、エントリを削除するのではなく、送信済みとしてマークすることをお勧めします。いつか問題が発生し、電子メールを再送信する必要があるかどうかはわかりません。これは、同様の設定で何度も発生するのを見てきました。

于 2008-11-26T21:44:07.940 に答える
5

1 つの注意 - Web アプリケーションで最初の電子メールの送信を密結合すると、脆弱なアーキテクチャ (SMTP サーバーが使用できないなど) が発生し、メッセージが失われる可能性があります。

最初の電子メールとリマインダー電子メールの両方に MSMQ を介して抽象化レイヤーを導入し、スケジュールに基づいてキューを一掃するサービスを用意できます。最初のメッセージには、「SEND NOW」を意味する属性でフラグを付けることができます。リマインダー メッセージには「SCHEDULED」のフラグを付けることができます。スイーパーは、「SEND NOW」または「SCHEDULED」であり、toBeSentDate >= 現在の日付を持っています。メッセージが正常に送信されると、キューからメッセージを削除することで作業単位を終了できます。

このアプローチにより、メッセージが失われることはなく、サービスのポーリング間隔を調整することで、オフピーク時に負荷を分散できます。

Rob Williams が指摘するように、MSMQ の私の提案は、この特定の質問に対しては少しやり過ぎです...しかし、規模の問題を検討し始めるときに覚えておくべき実行可能なアプローチであり、最小限に抑えたい (または必要とする) /データベースの読み取り/書き込みアクティビティを減らします (特に処理のピーク時)。

ロブに敬意を表します。

于 2008-11-26T21:55:01.380 に答える
2

大規模なプロジェクトごとに、通常、定期的または定期的なタスクを実行するサービスも作成します。

このサービスは、データベース内のどこかでステータスと最終実行時刻を更新し、その情報をアプリケーションで利用できるようにします。

たとえば、アプリケーションはコマンドをコマンド キューに送信し、サービスはそれらをスケジュールされた時間に処理します。

このソリューションは、必要なすべてのジョブが正しく設定されていることを確認するのではなく、インストールする必要があるサービスが 1 つだけであるため、SQL Server のタスクやジョブよりも扱いやすいと思います。

また、サービスは C# で記述されているため、T-SQL よりも強力なプログラミング言語 (およびライブラリ) を利用できます。

処理する必要があるのが本当に純粋な T-SQL である場合は、日付の変更時にサービスが呼び出す Execute_Daily ストアド プロシージャが存在します。

于 2008-11-26T22:10:30.053 に答える
2

他の人が示唆しているように、別のバッチサービスを作成しますが、それを使用してすべての電子メールを送信します。

Web アプリは、即時通知とリマインダー通知の両方について、通知を送信する必要があることをデータベース テーブルに記録する必要があります。両方のレコードには、希望する送信日時の注釈が付けられます。

MSMQ を使用するのはやり過ぎです。既にデータベースと単純なアプリケーションが用意されています。複雑さが増すにつれて、MSMQ または同様のものがその複雑さとスケーラビリティに役立つ可能性があります。

このサービスは、データベース テーブルを定期的に (数分から数時間ごとに) スキャンして、近い将来に送信する通知 (電子メール) を探し、送信し、成功した場合は送信済みとしてマークする必要があります。最終的にはこれを活用して、テキスト メッセージ (SMS) やインスタント メッセージ (IM) などを送信することもできます。

その間、コマンド デザイン パターンの使用を検討し、このサービスを再利用可能なコマンド エグゼキュータとして実装する必要があります。私は最近、不動産リスト (MLS) データをサードパーティ プロバイダーと同期させる必要がある Web アプリケーションでこれを行いました。

于 2008-11-26T22:22:36.817 に答える
0

このアプリを安価なホスティングサービス(GoDaddyなど)でホストすることを計画している場合は、Application_StartでGlobal.asaxのワーカースレッドをスピンオフし、スリープ、ウェイクアップ、メールの送信を行うことをお勧めします。睡眠...

SQL Serverマシンで何かを実行することはできず、独自のサービスをインストールすることもできないためです。

私はこれを行います、そしてそれはうまくいきます。

于 2008-11-26T23:56:42.413 に答える
0

あなたの選択肢 2 は確かにあなたが発明しているように思えます。もしあなたがそのようなものを送ってきたら、私のメールシステムは将来の配信のためにメッセージを保持しないことを私は知っています.

明らかな何かが欠けているとは思いません。メールを送信するには、予定の日に実行されるものが必要になります。それが SQL ジョブとして優れているか、別のアプリケーションとして優れているかは、アプリケーション アーキテクチャ次第です。

于 2008-11-26T21:34:18.677 に答える
0

SQL またはその他のアプリケーションを使用して毎日自動的に実行し、電子メールを送信する最初のオプションをお勧めします。それは簡単で、うまくいきます。

于 2008-11-26T21:37:24.740 に答える
0

Microsoft Office には配信遅延機能がありますが、これは Exchange/Mail Server の問題ではなく Outlook の問題だと思います。そのため、オプション 1 または 3 を使用する必要があります。または、オプション 4 はサービスを作成することです。そうすれば、オプション 3 のアプリケーションを実行するために、スケジュールされたタスクについて心配する必要がなくなります。

于 2008-11-26T21:43:53.180 に答える