【解決方法】C# メールキットで一括メールを送信するにはどうすればよいですか?


こんにちは皆さん、私は部分的にC#を使用して一括メール送信アプリケーションをコーディングしています。単一のメールを送信するときはすべて問題ありません。たとえば、5人の受信者に一括メールを送信したい場合、問題はありません。 error 4 回エラーメッセージが「The Smtp Client Not Connected」 1 回「Message Sent」なので、5 メール中 1 メールのみ送信

C#
using MailKit.Net.Smtp;
using MailKit;
using MimeKit;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;

            BodyBuilder builder = new BodyBuilder();
            builder.HtmlBody = rchtxtboxebody.Text;

            MimeMessage message = new MimeMessage();
            message.Subject = txtsubject.Text;
            message.Body = builder.ToMessageBody();

            SmtpClient sc = new SmtpClient();
            sc.Timeout = 3000;
            sc.AuthenticationMechanisms.Remove("XOAUTH2");

            sc.Connect(txthostname.Text, int.Parse(txtport.Text), chkssl.Checked);
            sc.Authenticate(txtusername.Text, txtpassword.Text);
            foreach (string email in lstleads.Items)
            {
                try
                {
                    message.From.Add(new MailboxAddress(txtfromname.Text, txtfrommail.Text));
                    message.To.Add(MailboxAddress.Parse(email));
                    sc.Send(message);

                    Thread.Sleep(3000);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    sc.Disconnect(true);
                }
            }

        }

これは私が使用しているコードですが、どこに問題がありますか?

私が試したこと:

タイムアウトを 10000 に変更しようとしましたが、うまくいきませんでした

解決策 1

finally { sc.Disconnect(true); } ループ内のブロックにより、最初のメッセージが送信された後にクライアントが切断され、再接続を試みることはありません。

また、最初のメッセージの後に受信者リストをクリアしません。 10 通のメッセージを送信すると、最初の受信者は 10 通のコピーを受け取り、それぞれのメールにあなたのリストからもう 1 つのアドレスが追加されます。 2 番目の受信者は 9 件のメッセージを受け取ります。

C#
try
{
    foreach (string email in lstleads.Items)
    {
        message.To.Clear();
        message.To.Add(MailboxAddress.Parse(email));
        sc.Send(message);
        Thread.Sleep(3000);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    sc.Disconnect(true);
}

注意: この種のコードは、メール アカウントがスパム行為で禁止される可能性が非常に高くなります。

解決策 2

電子メール アドレスによるループの代わりに BCC 配列を使用しないのはなぜですか?

コメント

タイトルとURLをコピーしました