2013-02-26 2 views
1

Я использую System.Net.Mail. В этой области есть несколько тем, но они ASP.NET и часто связаны с VB. Я изолирую код от кода скелета рабочего стола, я использую .NET 3.5 и C#. Таким образом, отправка работ во всех сценариях, что я пытался (EnableSsl false/true, UseDefaultCredentials false/true). Но SendAsync работает только в том случае, если UseDefaultCredentials не установлен в true (получается, что может даже иметь значение, если вы явно задали значение false, по умолчанию оно ложно), EnableSsl - true (OK, это тоже могут быть настройки сервера) и hardcode freakin мои полномочия. Я хочу иметь возможность SendAsync использовать UseDefaultCredentials. Код:Почему SmtpClient SendAsync выбрасывает исключения с комбинациями UseDefaultCredentials и EnableSsl, а Send отлично работает

void sendmail() { 
    MailMessage email = new MailMessage(); 
    email.From = new MailAddress("[email protected]"); 
    email.To.Add("[email protected]"); 
    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

Зачем? – Xharze

+0

Исключение (во всех комбинациях): «System.Net.Mail.SmtpException: для SMTP-сервера требуется защищенное соединение или клиент не был аутентифицирован. Ответ сервера: 5.7.1 Клиент не был аутентифицирован в System.Net. Mail.SendMailAsyncResult.End (результат IAsyncResult) в System.Net.Mail.SmtpClient.SendMailCallback (результат IAsyncResult) ". Это также исключение, которое вы получаете, если просто ошибаетесь в пароле или что-то в этом роде. Но, как я уже сказал, все (значимые) сценарии работают с Send() и не работают с SendAsync(). –

+0

Мое приложение запускается с правами моего пользователя. Может случиться так, что фоновый поток, выполняющий задачу отправки почты, запускается с другими привилегиями? Это настольное программное обеспечение. Даже UseDefaultCredentials = true не работает. В конце концов, я могу обернуть всю синхронную отправку в асинхронный слой, созданный мной, или подключить его к обмену сообщениями. Но тогда я буду кричать в подушку, SendAsync не имеет особого смысла. Я потратил столько часов на это сейчас, и это должно сработать. –

ответ

1

Используйте шаблон обмена сообщениями, как EventAggregator призмы (с указанием ThreadOption.BackgroundThread). Таким образом, вызывающий абонент отправляет сообщение (сообщение будет содержать From, To, Subject, Body), и оно является асинхронным с точки зрения отправителя. Затем используйте функцию синхронной отправки System.Net.Mail в пользователе/​​обработчике сообщения. Это, вероятно, работает, потому что исполняемый фоновый поток имеет более правильные привилегии, чем то, что появляется SendAsync.

Смежные вопросы