使用SMTP优化发送消息

时间:2013-12-09 22:40:21

标签: c# .net wpf email

我有一个通过SMTP发送电子邮件的应用程序,但它比罪恶慢。两个收件人可能需要20多秒。我认为问题在于程序逻辑。

程序打开一个带有电子邮件地址和显示名称的csv,然后使用for循环向每个收件人发送消息。

问题是,我担心每次发送给列表中的下一个人时都会重新建立SMTP连接。

我的问题是,如何为每个用户设置SMTP连接并重用该连接? (除非这不是为什么它的速度慢,有人可以告诉我为什么它的运行速度这么慢)

void DoWork(object sender, DoWorkEventArgs e)
    {
        // Get User List
        List<string[]> mycsv = csvRead();

        int total = mycsv.Count;

        // Send Message to each user
        for (int x = 0; x < total; x++)
        {
            //Actual send message
            sendMail(mycsv[x][0], mycsv[x][1]);
        }

    }


private void sendMail(string toEmail, string toName)
    {
        string email = Properties.SMTP.Default.Email;
        string name = Properties.SMTP.Default.DisplayName;

        MailMessage mail = new MailMessage();
        mail.From = new MailAddress(email, name);

        //Recipient Address
        mail.To.Add(new MailAddress(toEmail, toName));

        //Formatted mail
        mail.IsBodyHtml = true;
        // htmlMessage and Subject are global
        mail.Body = htmlMessage;
        mail.Subject = htmlSubject;

        SmtpClient smtp = smtpDetails();
        smtp.Send(mail);
    }

private SmtpClient smtpDetails()
    {
        int port = Convert.ToInt32(Properties.SMTP.Default.ServerPort);
        string email = Properties.SMTP.Default.Email;
        string username = Properties.SMTP.Default.Username;
        string password = Properties.SMTP.Default.Password;
        string host = Properties.SMTP.Default.ServerAdd;

        SmtpClient smtp = new SmtpClient();
        smtp.Port = port;
        smtp.EnableSsl = true;
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtp.UseDefaultCredentials = false;
        smtp.Credentials = new System.Net.NetworkCredential(username, password);
        smtp.Host = host;
        return smtp;

    }

VS:2013 - 4.5 .net - WPF app

2 个答案:

答案 0 :(得分:0)

提高速度的一种方法是为邮件传递创建一个静态类。例如。一个带有静态方法SendMail的邮件处理程序类(将smtpDetails()放入其中)。 因此,不需要为循环中的每个调用创建SmtpClient的新实例 - 只需重用静态方法。

答案 1 :(得分:0)

你也可以使用:

 using(SmtpClient smtp = new SmtpClient())
 {
      Port = port
      //etc
 }

这将处理所有smtp连接。