2013-02-26 7 views
1

System.Net.Mail을 사용하고 있습니다. 이 영역 주변에는 몇 가지 주제가 있지만 ASP.NET과 종종 VB와 관련되어 있습니다. 저는 코드를 데스크탑 스켈레톤 코드로 분리하고 있습니다. .NET 3.5와 C#을 사용합니다. 보내기는 내가 시도한 모든 시나리오에서 작동합니다 (EnableSsl false/true, UseDefaultCredentials false/true). 하지만 UseAsefync는 UseDefaultCredentials가 true로 설정되지 않은 경우에만 작동합니다 (명시 적으로 false로 설정하면 문제가 될 수 있습니다. 기본값은 false 임). EnableSsl은 true (OK, 서버 설정 일 수도 있음)이고 freakin 하드 코드입니다. 내 신임장. UseDefaultCredentials를 사용하여 SendAsync를 할 수 있기를 원합니다. 코드 : (ThreadOption.BackgroundThread 지정) 프리즘의 EventAggregator 같은왜 SmtpClient SendAsync가 SendDefaultCredentials와 EnableSsl의 조합으로 예외를 throw하는 이유는 무엇입니까?

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 결과) at System.Net.Mail.SmtpClient.SendMailCallback (IAsyncResult result) ". 비밀번호 나 다른 비밀번호를 잘못 입력하면 예외가됩니다. 그러나 내가 말한 것처럼 모든 (의미있는) 시나리오는 Send()와 함께 작동하고 SendAsync()에서는 작동하지 않습니다. –

+0

내 응용 프로그램이 내 사용자의 권한으로 시작됩니다. 메일 보내기 작업을 실행하는 백그라운드 스레드가 다른 권한으로 실행될 수 있습니까? 이것은 데스크탑 소프트웨어입니다. 심지어 UseDefaultCredentials = true가 작동하지 않습니다. 결국 나는 전체 동기식 전송을 나에 의해 만들어진 비동기 계층으로 랩핑하거나 메시징에 와이어 링 할 수 있습니다. 하지만 그때 내 베개로 비명을 지르지, SendAsync 너무 많이 이해가되지 않습니다. 나는 지금 이것에 얼마나 많은 시간을 보냈 는가, 그것은 단지 작동해야만한다. –

답변

1

를 사용하여 메시징 패턴. 이렇게하면 발신자가 보낸 메시지 (보낸 사람,받는 사람, 제목, 본문 포함)가 보낸 사람의 관점에서 비동기 적입니다. 그런 다음 메시지의 소비자/처리기에서 System.Net.Mail의 동기 전송 기능을 사용하십시오. 이것은 실행중인 백그라운드 스레드가 SendAsync가 생성하는 것보다 적절한 권한을 가지고 있기 때문에 효과가있을 것입니다.