c#MailSender并睡觉

时间:2012-09-22 15:45:16

标签: c# sleep smtpclient mail-sender

我正在编写一个通过类SmtpClient发送电子邮件的程序。我使用这段代码:

        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("mailSMTP.it");

            mail.From = new MailAddress("address.it");

            mail.Subject = "oggetto";

            mail.IsBodyHtml = true;
            string htmlBody = "someHTML";

            mail.Body = htmlBody;

            SmtpServer.Port = 25;

            SmtpServer.EnableSsl = false;

            foreach (string indirizzo in indirizzi)
            {
                mail.To.Clear();
                mail.To.Add(indirizzo);
                SmtpServer.Send(mail);
                System.Threading.Thread.Sleep(3000);
            }

            MessageBox.Show("e-mail spedite!");

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

但只有切断“睡眠”线才有效。为什么?我觉得在这个过程中休息是个好主意。

5 个答案:

答案 0 :(得分:2)

鉴于存在异常,假设它在调用Send时,我建议不要重复使用MailMessage对象并在循环的每次迭代中创建一个新对象。例如:

        //...
        foreach (string indirizzo in indirizzi)
        {
            string htmlBody = "someHTML";
            MailMessage mail = new MailMessage 
            {
                From = new MailAddress("address.it"),
                Subject = "oggetto",
                IsBodyHtml = true,
                Body = htmlBody,
            };

            mail.To.Clear();
            mail.To.Add(indirizzo);
            SmtpServer.Send(mail);
        }

如果“工作”是指你的MessageBox在合理的时间内出现......那么原因是因为Sleep阻止了UI线程,直到所有的消息都是发送。例如如果您尝试发送10条消息,UI将暂停30秒(3000毫秒X 10)。

答案 1 :(得分:0)

我认为你为这个过程定义了新的线程,因为如果你写System.Threading.Thread.Sleep(3000);意味着主线程要休眠3000ms。

因此,为此过程创建一个嵌套线程,然后可以停止/休眠线程。

答案 2 :(得分:0)

在我看来(和others)你应该尽量避免睡眠,最常见的是你最终得到一个行为奇怪的应用程序(比如你描述的行为)。

我会用一个使用索引来确定下一个要发送的邮件的计时器来解决它。像这样:

    try
    {
        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("mailSMTP.it");

        mail.From = new MailAddress("address.it");

        mail.Subject = "oggetto";

        mail.IsBodyHtml = true;
        string htmlBody = "someHTML";

        mail.Body = htmlBody;

        SmtpServer.Port = 25;

        SmtpServer.EnableSsl = false;

        var index = 0;

        var timer = new System.Threading.Timer((callbackState) =>
            {
                mail.To.Clear();
                mail.To.Add(indirizzi[index]);
                SmtpServer.Send(mail);

                index++;

                if (index < indirizzi.Count)
                  timer.Change(3000, Timeout.Infinite);
                else {
                    timer.Dispose();
                    Invoke(new Action(DisplayAllEmailsSentMessage));
                }
            }, timer, 3000, Timeout.Infinite);

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

请注意,您必须使用Invoke以任何方式与Windows窗体交互,例如显示消息框。这是因为Threading.Timer回调在它自己的线程上执行。

您也可以使用Windows.Forms.Timer,但我很少自己使用它,因为它位于Windows.Forms命名空间中,因此仅适用于以Windows窗体编写的UI。

答案 3 :(得分:0)

由于不活动,Smtp服务器正在断开连接。这很可能会释放服务器上的资源。

来自SmtpClient文档:

  

由SmtpClient的当前实例建立的连接   如果应用程序希望,可以重新使用SMTP服务器的类   将多条消息发送到同一SMTP服务器。这是特别的   在使用身份验证或加密时有用建立一个   连接到SMTP服务器。认证过程和   建立TLS会话可能是昂贵的操作。要求   发送大型邮件时为每条消息重新建立连接   到同一SMTP服务器的电子邮件数量可能很大   对绩效的影响。

一般情况下,其他响应者说你不应该在发送之间睡觉。 Smtp服务器足够强大,可以处理您可以按顺序抛出的所有电子邮件。

答案 4 :(得分:0)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

 class MailSender
    {
        public static int CreateMessageMdp(String destination,String mdp)
        {
            try
            {
                var client = new SmtpClient("smtp.domain.com", 587)
                {
                    Credentials = new NetworkCredential("appgestionali@domain.com", "password"),
                    EnableSsl = true
                };
                DateTime localDate = DateTime.Now;
                string body = "Suite à votre demande de mot de passe le " + localDate.ToString("F") + "\n on vous envoi votre mot de passe est :" + mdp;
                client.Send("appgestionali@domain.com", destination, "Information", body);
            }
            catch (Exception ex)
            {
                MessageBox.Show(""+ ex.GetBaseException());
                return -1;
            }
            return 0;
        }
    }
}