为什么SmtpClient SendAsync会抛出UseDefaultCredentials和EnableSsl组合的异常,而Send工作正常

时间:2013-02-26 23:29:07

标签: c# smtpclient sendasync

我正在使用System.Net.Mail。这个领域有一些主题,但它们是ASP.NET并且经常与VB相关。我将代码隔离成桌面框架代码,我使用.NET 3.5和C#。 所以发送适用于我尝试过的所有场景(EnableSsl false / true,UseDefaultCredentials false / true)。但SendAsync仅在UseDefaultCredentials未设置为true时才有效(事实证明,如果您明确将其设置为false,默认情况下它为false),EnableSsl为真(OK) ,也可以是服务器设置),并硬编码我的凭据。我希望能SendAsync使用UseDefaultCredentials。 代码:

void sendmail() {
  MailMessage email = new MailMessage();
  email.From = new MailAddress("tcs@software.com");
  email.To.Add("tcs@software.com");
  email.Subject = "Simple test email subject";
  email.Body = "Simple test email body";
  string mHost = "mail.software.com";
  string mUsername = @"DOMAIN\tcs";
  string mPassword = "myfreakinpassword?Really???";
  SmtpClient smtpCli = new SmtpClient(mHost);
  //smtpCli.UseDefaultCredentials = true;
  smtpCli.Credentials = new NetworkCredential(mUsername, mPassword);
  smtpCli.EnableSsl = true;
  smtpCli.SendCompleted += smtpCli_SendCompleted;
  try {
    //smtpCli.Send(email);
    smtpCli.SendAsync(email, null); // This mofo only works in this combination
  }
  catch (Exception ex) {
    Console.WriteLine(ex);
  }
}
void smtpCli_SendCompleted(object sender, AsyncCompletedEventArgs e) {
  if (e.Error != null)
    Console.WriteLine(e.Error);
}

1 个答案:

答案 0 :(得分:1)

使用Prism EventAggregator之类的消息传递模式(指定ThreadOption.BackgroundThread)。这样调用者发送消息(消息将包含From,To,Subject,Body),并且它与发送者的观点是异步的。然后在消息的使用者/处理程序中使用System.Net.Mail的同步Send函数。 这可能有效,因为正在执行的后台线程拥有的权限比产生SendAsync的权限更多。