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