これはかなり簡単なようです。ASP.NET アプリケーションから電子メールを送信する必要があります。奇妙なエラーが発生せず、CPU 使用率が上限を超えることなく、一貫してこれを行う必要があります。私は大量の電子メールについて話しているのではなく、時折の電子メールについて話している.
System.Net.Mailはひどく壊れているようです。SmtpClient は Quit コマンドを発行しないため (Microsoft(R) が仕様に従うことに関心がないためかもしれません)、接続は開いたままになります。したがって、その接続が最終的に閉じる前に誰かが電子メールを送信しようとすると、開いている接続が多すぎるというエラーを SMTP サーバーから受け取る可能性があります。これは、Microsoft(R) が修正にまったく関心がないバグです。ここを参照してください:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711
また、このコードを使用してこの問題を解決することをお勧めします。
smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
わかりました、はい、接続が開いたままになるという問題を「解決」します。ただし、これは一貫して、必要に応じてサーバーで試してみると、プロセス (この場合は w3wp.exe) が実行されている CPU がジャンプし、アプリケーション プールがリサイクルされるまで 100% のままになります。何らかの理由で、mscorwks.dll!CreateApplicationContext を実行するスレッドが原因です。
これには、持続的な 100% の CPU 使用率に眉をひそめる Web ホストで実行している場合、アプリケーション プールが無効になるという非常に良い副作用があります。したがって、これは一部の人が示唆するほど簡単ではありません。
だから私の質問は何をすべきか?私がしなければならないことはとても簡単です。ただし、「開いている接続が多すぎます」というエラーは受け入れられず、CPU 使用率も 100% ではありません。サード パーティのコンポーネントを購入したくないのは、安いからではありませんが、シンプルな SMTP 機能に 100 ドルから 300 ドルを支払う必要があるとは思えないほど、十分な数のコンポーネントと MSDN サブスクリプションを購入しています。
MaxIdleTime を高く設定すると役立つことがあると読みましたが、それには懐疑的です。Microsoft が SMTP 仕様に準拠したくないという理由だけで、アプリ プールが無効になる危険を冒したくありません。
編集: quiksoft.com コンポーネントを見ましたが、SMTP 認証をサポートしておらず、500 ドルかかります。この問題には解決策が必要です。