4

私のWebアプリケーションでは、事前に選択した期間に従ってユーザーにメールを送信したいと考えています。
例: ユーザー 01 に 3 日ごとに 1 つの HTML メールとユーザー 02 に 20 日ごとに 1 つの HTML メール

どうすればそれを実行できますか? リソースはありますか?私のGmailアカウントからテーブル内の任意のメールアドレスにアプリでメールを送信できますが、一定期間に自動的に送信する方法がわかりません.(私はC#とSQL Expressを使用しています)
助けてください!

4

5 に答える 5

5

私は解決策を見つけました。
私の検索によると、それを処理する3つの方法があります。

  1. SQL Serverと連携して、一定期間にメール通知を送信します。(またはこれ
  2. Windowsサービスを使用してTimerオブジェクトを作成し、それを使用して時間を確認します。

しかし、方法1と2では、サーバーにアクセスする必要があり、たとえばWinServiceをインストールするための専用ホスティングサーバーが必要です。そのため、通常使用する共有ホストスペースでは機能しません。だから私はあなたが見るように最良の方法を見つけました:

  3.  スケジュールされたジョブのASP.NETキャッシングを使用したWindowsサービスのシミュレーション。

上記のリンクは素晴らしい解決策です。したがって、Webアプリケーションの外部で作業する必要はありません。

于 2009-12-26T22:17:41.693 に答える
3

cron デーモンや Windows タスク スケジューラなど、定期的にジョブを実行できるものが必要になります。

基本的に、定期的なジョブを開始して、必要なメール処理を行います。

メールの次のバッチを送信する必要があるまで基本的にスリープする Windows サービスを作成できる場合は、コードからこれを行うこともできます。

最も簡単な方法は、定期的に実行するタスク スケジューラまたは cron ジョブを作成することです。そうすれば、メール送信部分を処理するための小さなコードが必要になり、それを 1 時間または 1 日または必要に応じて実行するようにスケジュールするだけです。

于 2009-12-25T20:19:03.570 に答える
3

ハイ、

Quartz.netをご覧ください。

Quartz.NETは、最小のアプリから大規模なエンタープライズ システムまで使用できるフル機能のオープン ソース ジョブ スケジューリング システムです。

Quartz.NETは、非常に人気のあるオープン ソースの Java ジョブ スケジューリング フレームワークである Quartz のポートです。Quartz.NET はすぐに使用できるクラスタリングとデータベースの永続性をサポートし、cron のような式、間隔トリガー、除外アドバイスを使用してジョブをスケジュールする強力な手段を備えています。

于 2009-12-28T10:02:12.213 に答える
2

私は解決策があると思います:

1-ユーザーテーブルがあり、最初の列にユーザーに送信された最後の電子メールの日付を追加し、2番目の列に電子メールを送信する期間がある場合、SQLデータベースのユーザーテーブルに2列を追加する必要がありますそのユーザーの例: LastEmailSentDate datetime SendEmailPeriod int

2-アプリケーションコードで、最後に送信された電子メールの最終日と電子メールの送信期間を比較する関数を記述します。

// ここに関数コード

public void CompareLastSentDate()
{
   // lets assume that you bring the data for the db using Sqdatareader reader
   //get the field from the LastEmailSentDate field in the  database as i mention before
   DateTime LastEmailSentDate = Convert.ToDate(reader["DatePeriod"]) 

   // get the field from the SendEmailPeriod of the user field from database
   int sendEmailPeriod =  Convert.Toint32(reader["SendEmailPeriod"]) 

   // now you have the date before the period of day ex: before 3 days depend on user
   DateTime DatePeriod = new DateTime(DateTime.Now.Year, DateTime.Now.Month, (DateTime.Now.Day - sendEmailPeriod ));

   // if the last email send is before period of day that mean u have to send an email again
   if(LastEmailSentDate.Day <= DatePeriod.Day)
   {
      // sent the email to the user
   }

}

注:これで、ユーザー間でループしてメールを送信できます

この関数は、アプリのホームページの Page_Load イベントから呼び出すことで 1 日に 1 回呼び出すことができ、その日の最初の呼び出しの後に application["LastFunctionCallDate"] = DateTime.Now フラグを追加して、次の場合にこのフラグをチェックできるようにします。その == 今日、そうでない場合はもう一度呼び出します

于 2009-12-25T20:38:35.363 に答える
2

IIS がホストする ASP.NET の優れた点は、IIS が (既定で) アプリケーション プール自体の設定に従って定期的にアプリケーション プールをリサイクルすることです。

アプリケーション プールが開始されると (特にアイドル状態が許可されている場合、つまり、ほとんどのアクティビティが 9 時から 5 時までのビジネス アプリの場合は、少なくとも 1 日に 1 回になる可能性があります)、Global.asax の Application_Start イベント ハンドラーが起動されます。これは、定期的なタスクに使用できます。

Application_Start ハンドラー内でこの電子メール送信を同期的に実行する必要は必ずしもありません。なぜなら、このメッセージング機能はスタートアップの中核ではないように思われるからです。

非同期を送信するには、たとえば非同期デリゲートを使用する必要があります。

于 2009-12-26T05:02:54.513 に答える