我在发送电子邮件列表时使用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);
}
}
答案 0 :(得分:1)
您每次都在创建SmtpClient
的新实例(然后重新分配处理程序)。使用范围更大的静态变量。
答案 1 :(得分:0)
它在我的机器上按预期工作,但MailMessage的构造函数抛出格式异常,因为"My Tex"
不是有效的电子邮件地址。第一个参数是发件人的电子邮件地址。
正如Josh Stodola指出的那样,你应该为这个类的生命缓存SmtpClient
而不是为每个调用创建另一个。{1}}。如果你不缓存SmtpClient
,那么你应该将以下行添加到SendCompletedCallback的末尾(最好是在finally块中):
((SmtpClient)sender).SendCompleted -= SendCompletedCallback;
如果这对您没有帮助,也许您可以发布更多详细信息 - 例如做调用的事件args中的数据是什么?