2011-09-07 5 views
0

작은 콘솔 응용 프로그램이 있습니다. 몇 가지 설정을 확인하고 결정을 내리고 이메일을 보냅니다. 문제는 응용 프로그램이 끝날 때까지 전자 메일이 실제로 보내지지 않는다는 것입니다. 전자 메일을 보내는 방법이 완료되면 즉시 전자 메일을 보내려고합니다.신청서에서 이메일을 보낼 때 지연을 피하려면 어떻게해야합니까?

처음에는 MailMessage를 만들고 .Send()를 호출했습니다. 앱이 끝날 때까지 메일이 전송되지 않고 있음을 알았습니다.

그럼 작업 병렬 라이브러리를 사용해 보았습니다.

var taskA = Task.Factory.StartNew(() => msg.Send()); 

다시 전체 응용 프로그램이 끝날 때까지 메시지가 전송되지 않습니다.

앱이 완료 될 때가 아니라 msg.send가 실행될 때 어떻게 이메일을 보내나요?

감사합니다.

+1

앱을 닫을 때까지이 보내지고 없다고 어떻게 확신? Send()는 동기 메서드입니다. Smtp 서버에 지연이있을 수 있습니다. –

+0

@ 케빈 - 나는 보내는 것을하는 방법을 밟은 후에 기다린다. SMTPClient.Send()가 이미 실행되었고 다른 메소드에 들어갔다. 15 분 이상 기다렸다가 아무 것도 내받은 편지함에 표시되지 않습니다. F5를 누르면 앱이 완료되는 순간 두 번째 또는 두 번째 메시지가 표시됩니다.기다리지 않으면 (앱이 중단 점없이 실행되도록 함) 메시지가 두 번째 또는 두 번째 내에 표시됩니다. – DenaliHardtail

+0

SMTP 서버가 사용중인 컴퓨터의 로컬 서버입니까, 아니면 다른 컴퓨터에 있습니까? –

답변

0

지연을 피하는 가장 확실한 방법은 픽업 디렉토리를 사용하는 것입니다. 픽업 디렉토리는 메시지를 즉시 보내지 않고 대기열에 넣습니다.

0

새 MailMessage를 만들고 SmtpClient와 함께 보냅니다. 즉시 보냅니다. 나는 예제를 추가 할 것이다.

EDIT : 변수 host, port에 smtp ser ver 이름과 포트 번호를 입력하십시오.

using (var mailer = new SmtpClient(host, port)) 
{ 
    using (var message = new MailMessage(sender, recipient, subject, body) { IsBodyHtml = false }) 
    { 
     mailer.UseDefaultCredentials = false; 
     mailer.Credentials = new NetworkCredential(user, pass); 
     mailer.EnableSsl = useSSL; 
     mailer.Timeout = Timeout; 
     mailer.Send(message); 

    } 
} 

지연이 여전히 발생하면 메일 서버에 지연이 발생합니다.

1

SMTP 클라이언트를 사용해야합니다. 다음과 같이하십시오.

  MailMessage mm = new MailMessage(); 
      //fill in your message 
      NetworkCredential nc = new NetworkCredential(FromAddress, FromPassword); 
      SmtpClient sc = new SmtpClient(SmtpHost, SmtpPort); 
      sc.EnableSsl = true; 
      sc.Credentials = nc; 
      sc.Send(mm); 

이 단계에서 메일이 전송됩니다.

그러나 전자 메일을 보내는 것은 비동기 동작이므로 전자 메일을 수신 할 때까지 약간의 시간이 걸립니다.

3

SmptClientSendAsync을 통한 메일의 비동기 전송을 지원하지만 실제로 웹 응용 프로그램에서는 요청 스레드가 중단됩니다.

블로킹을 피하려면 ThreadPool을 사용하여 백그라운드 스레드에서 이메일을 실행하는 것이 좋습니다. 이렇게해도 응용 프로그램이 차단되지는 않습니다.

ThreadPool.QueueUserWorkItem(o => { 
    using (SmtpClient client = new SmtpClient(...)) 
    { 
     using (MailMessage mailMessage = new MailMessage(...)) 
     { 
      client.Send(mailMessage, Tuple.Create(client, mailMessage)); 
     } 
    } 
}); 
0

MailMessage 및 SmtpClient 개체를 .Send() 함수 뒤에 배치하기 만하면됩니다. 설정에

SmtpClient smtpClient = new SmtpClient("server", 25); 
smtpClient.UseDefaultCredentials = true; 

MailMessage message = new MailMessage("ToAddress","FromAddress"); 
message.Subject = "Test email"; 
message.Body = "Test email"; 

smtpClient.Send(message); 

message.Dispose(); 
smtpClient.Dispose(); 
관련 문제