6

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

3 回答 3

13

解决了:

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();
于 2013-01-25T09:27:33.270 回答
3

您可以通过预先定义所有内容并调用新线程来更轻松地完成此操作。

//define everything above

Thread t1 = new Thread(delegate()
{

     SMTP.send(message);

});

t1.Start();

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

于 2015-06-22T13:57:55.830 回答
1

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

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

于 2013-01-25T10:41:39.933 回答