C# 使用SmtpClient发送邮件列表

C# 使用SmtpClient发送邮件列表,c#,.net,winforms,C#,.net,Winforms,发送电子邮件列表时,我使用SmtpClient的SendCompletedEventHandler SendCompletedEventHandler仅在已发送列表中的所有电子邮件时调用 在我看来,发送电子邮件时会调用SendCompletedEventHandler 我的代码有问题吗 public void SendAllNewsletters(List<string> recipients) { string mailText = "My Tex

发送电子邮件列表时,我使用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);
        }            
    }
public void sendall新闻稿(列出收件人)
{
string mailText=“我的文本”;
foreach(收件人中的字符串收件人)
{
//如果此循环需要10分钟,则第一次调用
//SendCompletedCallback在10分钟后完成
发送通讯(邮件文本、收件人);
}
}
public bool SendNewsletter(字符串邮件文本、字符串电子邮件地址)
{
SmtpClient sc=新的SmtpClient(_-smtpServer,_-smtpPort);
System.Net.NetworkCredential SMTPUserInfo=新系统.Net.NetworkCredential(\u smtpuser,\u smtppassword);
sc.凭证=SMTPUserInfo;
sc.SendCompleted+=新的SendCompletedEventHandler(SendCompletedCallback);
MailMessage mm=null;
mm=新邮件消息(_senderemail,emailaddress);
mm.IsBodyHtml=true;
mm.Priority=MailPriority.Normal;
mm.Subject=“某物”;
mm.Body=mailText;
mm.SubjectEncoding=Encoding.UTF8;
mm.BodyEncoding=Encoding.UTF8;
//邮寄
字符串userState=emailaddress;
sc.sendsync(mm,userState);
返回true;
}
public void SendCompletedCallback(对象发送方,AsyncCompletedEventArgs e)
{
//获取此异步操作的唯一标识符。
字符串标记=(字符串)e.UserState;
如果(例如错误!=null)
{
_news.setnewslettesemailsissent(e.UserState.ToString(),_newslettesname,false,e.Error.Message);
}
其他的
{
_news.setnewslettesemailsissent(e.UserState.ToString(),_newslettesname,true,string.Empty);
}            
}

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

它在我的计算机上正常工作,只是MailMessage的构造函数引发格式异常,因为
“my Tex”
不是有效的电子邮件地址。第一个参数是发件人的电子邮件地址

正如Josh Stodola所指出的,您应该在这个类的生命周期中缓存
SmtpClient
,而不是为每个调用创建另一个。如果不缓存
SmtpClient
,则应在SendCompletedCallback的末尾添加以下行(最好在finally块中):


如果这对您没有帮助,也许您可以发布更多详细信息,例如事件参数中哪些数据被调用?

听起来好像您假设处理程序只能与一个不正确的SmtpClient关联。此外,他每次都在创建一个新的处理程序,因此有一个1:1的关系。Thnx,我更新了帖子,使其对MailMessage使用了正确的语法。它解决了您的问题吗?
((SmtpClient)sender).SendCompleted -= SendCompletedCallback;