1

MailKitクライアントを作成し、接続を確立してメールを送信することにより、メールを正常に送信するために使用しています。アプリケーションでメッセージを受信するとうまく機能する非常に標準的なもので、何かを実行して電子メールを送信します。ただし、数万通の電子メールをできるだけ迅速
に処理できるようにしたいと考えています。 送信先の電子メール サーバーが使用できない可能性があるため、メッセージをすばやくバックアップできるため、バックログが発生します。

を使用MailKitして、メールを処理してできるだけ早く送信するための最善かつ最速の方法は何ですか? たとえば、現時点では、各メールが次々に処理される可能性があり、それぞれの処理に 1 秒かかる場合、40000 メールを送信するには長い時間がかかる可能性があります。

を使用しparallel foreachて多数のスレッドをスピンアップしてきましたが、これには制限があります。提案や推奨事項をいただければ幸いです。

コードサンプルが追加されました:訂正、新しいコードサンプルが追加されました。これははるかに高速ですが、毎回新しい接続を作成することはできません。Exchange は、「送信者は既に指定されています」というエラーをスローします。これは現在、平均で 1 秒あたり約 6 メールを送信しています。

            var rangePartitioner = Partitioner.Create(0, inpList.Count, 15);

            var po = new ParallelOptions { MaxDegreeOfParallelism = 30 };


            Parallel.ForEach(rangePartitioner, (range, loopState) =>
            {
                using (var client = new SmtpClient(new SlabProtocolLogger()))
                {

                    client.Connect(_appSettings.RelayAddress, _appSettings.RelayPort);
                    client.AuthenticationMechanisms.Remove("XOAUTH2");

                    for (int i = range.Item1; i < range.Item2; i++)
                    {

                        var message = _outboundQueueRepository.Read(inpList[i]).Load();
                        client.Send(message.Body, message.Metadata.Sender, message.Metadata.Recipients.Select(r => (MailboxAddress)r));

                        _outboundQueueRepository.Remove(inpList[i]);
                    };
                }

            });
4

2 に答える 2