使用SmtpClient发送邮件列表

时间:2010-04-21 15:45:36

标签: c# .net winforms

我在发送电子邮件列表时使用SmtpClient的SendCompletedEventHandler。

只有在已经发送列表中的所有电子邮件时才会调用SendCompletedEventHandler。

我发现,发送电子邮件时会调用SendCompletedEventHandler。

我的代码中有什么问题吗?

    public void SendAllNewsletters(List<string> recipients)
    {
        string mailText  = "My Text";
        foreach(string recipient in recipients)
        {
            //if this loop takes 10min then the first call to
            //SendCompletedCallback is after 10min
            SendNewsletter(mailText,recipient);
        }
    }

    public bool SendNewsletter(string mailText , string emailaddress)
    {

            SmtpClient sc = new SmtpClient(_smtpServer, _smtpPort);
            System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential(_smtpuser, _smtppassword);
            sc.Credentials = SMTPUserInfo;
            sc.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

            MailMessage mm = null;
            mm = new MailMessage(_senderemail, emailaddress );
            mm.IsBodyHtml = true;
            mm.Priority = MailPriority.Normal;
            mm.Subject = "Something";
            mm.Body = mailText ;
            mm.SubjectEncoding = Encoding.UTF8;
            mm.BodyEncoding = Encoding.UTF8;

            //Mail 
            string userState = emailaddress;
            sc.SendAsync(mm, userState);

            return true;
    }


    public void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
    {
        // Get the unique identifier for this asynchronous operation.
        String token = (string)e.UserState;
        if (e.Error != null)
        {
            _news.SetNewsletterEmailsisSent(e.UserState.ToString(), _newslettername, false, e.Error.Message); 
        }
        else
        {
            _news.SetNewsletterEmailsisSent(e.UserState.ToString(), _newslettername, true, string.Empty);
        }            
    }

2 个答案:

答案 0 :(得分:1)

您每次都在创建SmtpClient的新实例(然后重新分配处理程序)。使用范围更大的静态变量。

答案 1 :(得分:0)

它在我的机器上按预期工作,但MailMessage的构造函数抛出格式异常,因为"My Tex"不是有效的电子邮件地址。第一个参数是发件人的电子邮件地址。

正如Josh Stodola指出的那样,你应该为这个类的生命缓存SmtpClient而不是为每个调用创建另一个。{1}}。如果你不缓存SmtpClient,那么你应该将以下行添加到SendCompletedCallback的末尾(最好是在finally块中):

((SmtpClient)sender).SendCompleted -= SendCompletedCallback;

如果这对您没有帮助,也许您可​​以发布更多详细信息 - 例如调用的事件args中的数据是什么?