C# 使用 System.Threading 发送 SMTP

本文关键字:发送 SMTP Threading System 使用 | 更新日期: 2023-09-27 17:55:48

我开发了一个主要使用SMTP发送电子邮件的应用程序。一个接一个地发送消息很好,但是我希望加快这个过程。我创建了多个SmtpClient实例以及消息,以避免彼此之间的冲突。由于单独的实例,我认为在多个线程上执行.Send()会很好用。但是,仅使用我的Thread代码的某些内容不起作用,因为我甚至无法使用此代码在一个线程上发送一封电子邮件。我只是收到一个模糊的"Failure sending mail"例外。我将发布有效的代码,以及不起作用的Thread。有人可以分享他们认为可能是原因的原因吗?

注意 我目前并不打算使用较新的async功能,而是利用Thread

工作声明和方法调用:

var SMTP = new SmtpClient
    {
        Host = txtBxSenderHost.Text,
        Port = 587,
        EnableSsl = true,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        UseDefaultCredentials = false,
        Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
    };
using (var message = new MailMessage(senderAdrress, toAddress)
    {
        Subject = strSubject,
        Body = strBody
    })
    {
        SMTP.Send(message);
    }

不工作线程声明和方法调用:

var SMTP = new SmtpClient
    {
        Host = txtBxSenderHost.Text,
        Port = 587,
        EnableSsl = true,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        UseDefaultCredentials = false,
        Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
    };
using (var message = new MailMessage(senderAdrress, toAddress)
    {
        Subject = strSubject,
        Body = strBody
    })
    {
        Thread T1 = new Thread(delegate() { SMTP.Send(message); } );
        T1.Start();
    }

C# 使用 System.Threading 发送 SMTP

已解决:

var SMTP = new SmtpClient
        {
            Host = txtBxSenderHost.Text,
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
        };
        Thread T1 = new Thread(delegate()
        {
            using (var message = new MailMessage(senderAdrress, toAddress)
            {
                Subject = strSubject,
                Body = strBody
            })
            {
                {
                    SMTP.Send(message);
                }
            }
        });
        T1.Start();

通过事先定义所有内容并调用新线程,您可以更轻松地做到这一点。

//define everything above
Thread t1 = new Thread(delegate()
{
     SMTP.send(message);
});
t1.Start();

这就是我所做的,它使那些花括号的生活更轻松

为什么不直接使用 Smtp.SendAsync 方法呢?

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx