C#使用System.Threading发送SMTP

时间:2013-01-25 09:03:56

标签: c# multithreading smtp

我开发了一个主要使用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();
    }

3 个答案:

答案 0 :(得分:12)

解决:

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();

答案 1 :(得分:3)

通过事先定义所有内容并调用新线程,您可以更轻松地完成任务。

//define everything above

Thread t1 = new Thread(delegate()
{

     SMTP.send(message);

});

t1.Start();

这就是我做了什么,它使这些花括号的生活更轻松

答案 2 :(得分:1)

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

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