2012-02-23 5 views
0

電子メールを継続的に送信するASP.Netメール配信アプリケーションを作成しました。この現象は、マシンを再起動しても保持されます。System.Timers.Timerにリンクされたメソッドが電子メールを繰り返し送信する問題

私が使用していたコードは以下の通りです:

  public void SendScheduleMail() 
      { 
       System.Timers.Timer myTimer = new System.Timers.Timer(); 
       myTimer.Interval =20000; 
       myTimer.AutoReset = true; 
       myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); 
       myTimer.Enabled = true;     
      } 

      public void myTimer_Elapsed(object source, System.Timers.ElapsedEventArgs e) 
      { 
       SmtpClient smtp = new SmtpClient("smtp.xxx.com", 587); 

       MailMessage message = new MailMessage(); 

       //password required//////////////////// 
       smtp.Credentials = new System.Net.NetworkCredential(tb_uname.Text, tb_pass.Text); 
       message.From = new MailAddress("my email ID"); 
       message.To.Add(new MailAddress(tb_to.Text)); 

       message.CC.Add(tb_cc.Text); 
       message.Bcc.Add(tb_bcc.Text); 

       message.Subject = tb_sub.Text; 
       message.Body = tb_body.Text; 
       message.IsBodyHtml = false; 


       smtp.EnableSsl = true; 
       smtp.Send(message); 

      } 
+0

umm ...なぜタイマーですか? –

+0

いつ停止する必要がありますか? – robasta

+0

誰がSendScheduleMailを呼び出していますか?また、あなたはどこにでもあなたのタイマーを持っていないので、あなたが方法を去る頃には消えていなければなりません - 実際に、あなたは明示的にそれを廃棄しています。あなたは何を達成しようとしていますか? – dash

答えて

1

あなたは間隔で送信を開始することmyTimer.Enabled = trueを指定する - あなたは刻々と過ぎ、ひいては電子メールを送信タイマーを停止するmyTimer.Enabled = falseを指定する必要があります。

しかし、奇妙なことに、イベントを発生させるまでに経過した時間の前に、おそらくTimerを処分しています。

+0

今、私はアプリケーションを停止しますが、私のメールシステムはメールを受信して​​いますので、今私は何をしていますか? –

+0

まあ、はい。私はそこにタイマーの処分を気付かなかった...私はそれが何をしているのだろうか... :)私はそれがGCedかもしれないが、付いているイベントがそれを防ぐだろうと結論づけているのだろうかと思っていたが、処分はちょうど間違っている – Chris

+0

大丈夫です。今は削除しました。 –

0

停止していない理由は、アプリケーションを閉じたり、マシンを再起動する前に、多くのイベントが発生している可能性が高いからです。

私はタイマーを使用する理由は完全にはわかりませんが、これは問題です。あなたがしないタイマーを止めるまで、繰り返し発砲します。

+0

私は最初はこう思っていましたが、OPは 'AutoReset'をtrueに設定しました。つまり、初めてイベントを発生させるだけです。 –

+1

@ Mr.Disappointment:あなたは間違ったやり方であなたの意味を持っています。自動リセットは、タイマーをリセットして再開することを意味します。 falseは一度だけ実行されるものです。 (ダブルチェックしたい場合はhttp://msdn.microsoft.com/en-us/library/system.timers.timer.autoreset.aspx) – Chris

+0

@Chris私はドキュメントを見てきましたが、実際は正しい。 –

1

タイマーは現在、毎秒myTimer_Elapsedを実行するように設定されています。これは何をしているのでしょうか。

このコンテキストの内容によっては、単なるアプリケーションの場合にコードを再起動するとメールの送信が停止するはずですが、サービスとしてインストールされている場合、再起動後に再開することがあります。

また、メールサーバーの速度によっては、処理中のメールのバックログがあり、プログラムがシャットダウンされた後も引き続き配信されます。送信を続けているのか、メールを受信し続けているのかを区別することが重要です。あなたはこれらの呼び出しのうちの複数を設定した状態であってもよいので、彼らは複数のタイマーを設定しますようにSendScheduleMailへ

最後に複数の呼び出しは、それが困難である意図についての詳細を知らなくても

...見てプログラムの設計についてはこれ以上は言いませんが、実際に何をしようとしているのかに応じて改善することができます。

+0

あなたの関心をお寄せいただきありがとうございますが、今はどのようにこのメールを止めていますか? –

+0

メールはまだ送信されているのですか、メールサーバーによって処理され続けていますか?私は上記のいくつかの理由について議論し、メールを停止する方法を説明する前に、より多くの情報を提供する必要があります。このコードはアプリかサービスですか?このアプリは現在実行中ですか(起動時に起動するか、起動時に起動するサービスなど)。すでに送信されて処理されているため、送信されているメールを停止する方法がない可能性があります。この場合、メールサーバーを制御できれば、メールサーバーを破棄するようにしなければなりません。もしあなたがちょうど待っていなければ... – Chris

+0

ここでは、私はcredentials.andを提供しているメールを送信するための1つのメール配信システムを使用しているので、私はそれを停止することはできませんので、私のコントロール下にありません。待つ。 –

-1

なぜTread.Sleepメソッドを使用するだけではありませんか?

+1

私の意見では 'Thread.Sleep'を使うのが良いでしょうか?一定の間隔で何かを起こしたいのであれば、これはタイマーのためのものであり、プログラムの性質によっては、ここではタイマーがないマルチスレッドについて心配する必要が生じるかもしれません。ローカルではないものを使用していないので、スレッドセーフであり、そのようなものは要因ではないので、心配する必要はありません)。 – Chris

関連する問題