1

SQL Server 2008 から取得したアドレスに電子メールを送信する ASP.NET Web アプリケーションに何かを実装することに関心があります。

これはそれほど難しいことではないようです。擬似コード:

EmailAddressList addresses = EmailAddressManager.GetList();

foreach (EmailAddress x in addresses)
{
    MailMessage msg = new MailMessage("fromaddress@test.com", x.ToAddress);
    //prepare msg, body, subject, etc.

    SmtpClient smtp = new SmtpClient();
    smtp.Send(msg);

    //add artificial delay for throttling?  this seems to be a common tactic
}

この質問には、役に立ったと思われるものにリンクする賛成のコメントがありますが、現在はページが見つかりませんというエラーにつながるだけです。

そして、この質問では、OPは、上記の擬似コードの方法は「良い方法」ではないと具体的に述べています。しかし、それの何が問題なのですか?これには一般的な、またはより良い方法がありますか? 私が考慮していない隠れた落とし穴はありますか?

そして、私たちの状況についてもう少し詳しく説明します。これはおそらく月に 2 回しか使用されず、一度に送信されるメールの数はおよそ 30 または 40 を超えることはありません。最終的な目標は、このページにアクセスすることです。これにはこのツールがあり、何を誰に送信するかをプレビューでき、ボタンを押すだけで上記の疑似コードが実行されます。

4

1 に答える 1

0

あなたがやっているようなループに問題はないと思いますが、おそらく処理する必要があることがいくつかあります。最も重要なのはおそらくエラー処理でしょう。電子メールの 1 つが失敗した場合、一部の人に電子メールを送信したことになり、残りの人に送信する必要がある場合に対処するのが難しくなります。単純な try-catch がある場合でも、それらのメールを再試行する際に問題が発生します。送信する予定のすべての電子メールと、各送信の結果を保存する何らかの方法が必要になる場合があります。

次はパフォーマンス関連です。.Send() を使用して一度に 1 つずつメールを送信すると、大量のメールの場合は遅くなります。これを回避する簡単な方法は、Task ライブラリまたは Async バージョンを使用して送信をマルチスレッド化することです。もちろん、これにより状態管理が少し複雑になりますが、メール送信速度が大幅に向上します。1 分/1 時間あたりに送信できるメールの数に制限がある場合、この最適化と矛盾する場合と矛盾しない場合があります。

受信者ごとに異なるコンテンツがある場合は、NVelocity や MS Razor Engine などのテンプレート ライブラリを使用することをお勧めします。

または、この退屈な作業を SendGrid などにアウトソーシングすることもできます。

于 2012-10-17T01:57:21.237 に答える