2010-12-06 9 views
2

私はウェブページから2000までの電子メールを1つ送信する必要があるプロジェクトの一部を持っています。オープンソースのバグトラッカーの1人は、スレッドを使用して電子メールを送信しましたが、バグが詰まっていました。C#Webページから大量の電子メールを送信する最適な方法は何ですか?

誰かが2000までの電子メールを送信する手続きをどのように作成できるか考えているかどうかを知りたいだけですか?

私はすべての電子メールを処理するのに時間がかからないので、私は同僚の一人が1つのプロセス(1回に1つの電子メールを送信する通常のルーチン)として残すように言われました。右のように見えないし、私はスレッドを使用したい...多分私は複雑なルーチンが好きですか?

[エクストラ] 私のようなものがあります: foreachの(emailAddressesの文字列電子メール) { はMailMessageはMailMessage =新しいはMailMessageを(); mailMessage.To.Add(...) ... SmtpClientクライアント=新しいSmtpClient(); client.Send(mailMessage); }

+0

おそらくhttp://stackoverflow.com/questions/1607178/background-task-with-an-asp-net-web-applicationを参照してください。しかし、私が2000年に読んだ他のスレッドからは、すぐにたくさんあり、SMTPサーバーはあなたがスパムしていると推測するかもしれません - 送信するバックグラウンドタスクだけでなく、より多くの問題があるかもしれません。 – Rup

+0

スレッドを使用する場合、いくつ作成しますか?あなたはまだ1つのスレッドで多数の電子メールを処理しているでしょう。また、スレッド数が多いほど、電子メールを送信するための各スレッドが使用できる帯域幅が少なくなり(動作の遅い部分)、元の簡単な(シングルスレッドの)ソリューションと同等のパフォーマンスが得られます。 –

+0

あなたは正しいです。このアイデアはメールを処理するためのスレッドです。 – Rob

答えて

1

System.Net.Mailを使用してメッセージを送信します。ただし、接続の問題を避けるために.NET 4を使用する必要があります。これは、Connect Webサイトにメッセージが送信されないバグがあったためです。 1

理由::

は三つの理由のためにスレッドを使用しないでくださいMTAは、メッセージの再試行を処理するために作られており、障害を処理することができます。あなたのコードはこれを処理するのに十分な堅牢性を持たないかもしれませんSystem.Net.Mailはこれを箱から出すことはできません。

理由2:スレッドを使用すると、ターゲットSMTPサーバーが圧倒され、ブロックされます。ほとんどのWindows SMTPリレーには、15(または25?)を超える同時接続の既定のブロックがあります。

Exchange 2010、または2007を扱っている場合、1分あたりx件以上のメッセージを送信するとアクティブになる調整機能があります。これは、MTA単位の設定であり、状況に合わせて調整する必要があります。

理由3:これを行うには、大量の同時接続を可能にする専用のIIS SMTPサーバー(またはExchange ...)が必要です。 Sys.Net.Mailを使用して、メールインフラストラクチャに配信タスクを渡してください。メールのインフラにはそれほど多くは必要ありません。あなたがリレーすることを可能にするMTAを持っていれば、それはあなたの代わりにあなたのためにインターネットに "スマートホスト"となります。

MTAの設定方法に関するその他の質問については、@ serverfaultにお問い合わせください。

しかし

あなたは、ASP.NETのWebページから電子メールを送信する場合は、スレッドを使用したいことがあります...またはその他のUIをブロックします。それ以外に、電子メール生成タスクのために並行スレッドを実行する必要はありません。

最後に、同じメッセージを多くの受信者に送信する場合は、配信リストを使用するか、同じメッセージに多数のターゲット受信者を追加することができます。

+0

OK。とにかくNet Mailを使用しましたが、システムはすべての電子メールが送信されるのを待ってから続行する必要がありました。私はあなたの2番目の段落を理解する必要がありますが、あなたの入力のためにありがとう:) – Rob

+0

私は混乱していることを知ったので、私は上記の応答を編集しました。また、あなたは新しいので、あなたが好きな回答をupvoteに自由に感じてください。 – LamonteCristo

+0

ありがとうございます。あなたの反応は素晴らしかったです。 – Rob

0

私は2000年が(ウェブページであり、ユーザーがそのページを待っている)長い時間がかかると思います。あなたの実装にもよりますが、これを頻繁にやっているのは、すでに作成されている「電子メールスレッド」をしたいということです。送信する電子メールがない場合、スレッドは中断され、リソースを消費しません。その後、電子メールを送信する必要があるときは、それらの電子メールを電子メールキューに入れ、スレッドを起動して送信を開始します(まだ開始していない場合)。

0

一度に50件以上を送信している場合は、これを行うサービスに契約する必要があります。さもなければあなたのメッセージは人の迷惑メールフォルダに終わるでしょう。

+0

OKスパム行為についてもっと理解する必要があります。 – Rob

1

おそらく、HTTPリクエストを処理しているスレッドで2000のメールを送信したくない場合があります。リクエストを送信したユーザーは、電子メールが送信されるまでサーバーが応答するのを待っています。これは、他のユーザーからの要求を処理するスレッドが少なくなっています。このような要求が多い場合は、サーバーのパフォーマンスを低下させる可能性があります。

代わりに、私はメッセージキューに要求を送信し、キューから別々のサービス処理アイテムを持ち、電子メールを送信します。 asp.netアプリのバックグラウンドスレッドを作成

は別の可能性ですが、あなたはどちらの状況で終わる:で使用されるものとは別に、あなたがあなた自身のタスクキューを持っている必要が

  1. 通常のスレッドプール。
  2. あなたの電子メールタスクは、http要求を処理するタスクと競合し、潜在的に飢えている可能性があります。

つまり、第2のプロセスの導入が望ましくない展開シナリオ(共有サーバー、顧客展開)があります。しかし、これらの制約がない場合は、UIリクエストを処理し、「達成」タスクを別のサービスに任せることに集中すれば、Webサイトの規模を拡大する方が簡単だから、「別プロセス」を実行します。

+0

ありがとうございます。私はこれらの電子メールをどのように管理するか真剣に考える必要があるように見えます。私は単純な答えを期待していたことを認めなければなりませんが、これは限られた時間とリソースで思考プロセスを再考する必要があることを証明しています。もう一度ありがとう。 – Rob

関連する問題