2010-01-21 3 views
7

나는 잠에서 깨어 나면 데이터베이스에서 데이터를 가져 오는 백그라운드에서 실행중인 스레드가 있습니다. SmtpClient (아래 코드)를 사용하여 Google 앱을 사용하여 이메일을 보내고 있습니다.백그라운드 스레드에서 이메일을 보내는 것에 대해 알아야 할 것은 무엇입니까? ASP.NET

제가 알고있는 것이 있는지 알고 싶습니까? 한 번에 하나의 이메일 만 전송할 계획입니다 (등록 또는 잊어 버린 비밀번호 이메일). 나는 무언가가 타임 아웃을 설정하지 않았거나 어쩌면 구글 애플 리케이션이 끝나고 앱이 폭발하기 때문에 스레드를 잠그는 것 같은 무언가가 일어날 수 있다는 것에 조금 걱정이된다. 나는 무엇을 알아야합니까? 어떻게 테스트해야하는지 물어봐야 할까?

 var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
+2

깨우기의 '트리거링'이 발생하는 곳에서이 논리를 호출 할 수없는 이유가 있습니까? 귀하의 비밀 번호 재설정을 보내려고 노력하고 그것을 실패하면, 나는 아마 그것을 알고 좋은 오류가 실패하고 앉아서 내가 기다리는 내받은 편지함을 기다리는 것을 원하지 않는 사용자로서 실패합니다. 사용자 요청을 처리하고 모두를 보내면 약간의 지연이 신호를 보내야하는 복잡성을 제거하는 데 가치가 있습니다. – Rosstified

답변

3

IIS를 사용하는 경우. 서버에 SMTP를 설치하여 모든 메일을 localhost에 보내십시오. 그렇게하면 이메일이 바로 통과되지 않고 SMTP 서버가 응용 프로그램을 정지하지 않고 이메일을 대기열에 넣습니다.

Gmail을 스마트 호스트로 사용하도록 SMTP 서버를 구성해야합니다. 구성 방법에 대한 자세한 정보가 필요하면 알려주십시오.

+0

이것은 또한 내가하는 방식입니다 - 더 빠르고 신뢰할 수 있습니다. 수신자가 유효하지 않거나 SMTP 서버가 다운되면 시간 초과 및/또는 예외가 발생합니다. 이렇게하면 IIS는 즉시 모든 메일을 수락하고 실패 할 경우 보내는 작업을 다시 시도하는 등 메시지를 보냅니다. – Richard

1

이것은 태그 중 하나이기 때문에 ASP.Net에서 수행 중이라고 가정합니다.

이 프로세스는 얼마나 중요합니까? 이것은 환경이 허용하는 경우 ASP.Net 런타임의 일부가 아닌 Windows 서비스의 좋은 후보가 될 수 있습니다.

당신은 데이터베이스에서 데이터를 가져 와서 이메일을 보낸다고 언급했습니다. 이 중 어느 것도 ASP.Net을 사용하지 않습니다. 또한 서비스를 통해 스레딩, 테스트, 로깅 및 비동기 옵션을 향상시킬 수 있습니다.

ASP.Net 런타임을 사용하려면 아직 수행하지 않은 경우 Asynchronous Pages을 고려하십시오. 이렇게하면 여러 메일 스레드를 생성하고 기본 페이지 스레드가 결과를 기다리게 할 수 있습니다. 지연된 스레드를 취소하고 기록 할 수있는 시간 초과 값을 설정할 수도 있습니다. 비동기 타임 아웃을 설정하고 처리하면 내가 의심하는 많은 문제를 해결할 수 있습니다. 이 솔루션은 최소한 페이지 생성 요청 스레드를 보내는 메일을 가져옵니다.

테스트는 간단해야합니다. 테스트를 위해 별도의 Google 계정을 등록 할 수 있습니다.

2

코드에 try/catch를 추가하면 괜찮습니다. 최악의 경우 결국 시간 초과됩니다. 그것은 영원히 실행되지 않으며 Google은 연결을 영원히 열어 두지 않을 것입니다 (실제로 SMTP는 제한 시간과 관련하여 용의주하지 않습니다 ... 느리면 연결이 끊어집니다).

try 
    { 
     var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
    } 
    catch 
    { 
     // do something 
    } 

다른 gmail 계정을 사용하십시오. 또한 하루에 보낸 이메일의 한도를 확인하고 싶을 수도 있습니다. gMail의 번호는 무엇인지 모르지만 단지 보내려는 사람이 얼마나 많은지 보낼 수는 없습니다.

+0

-1 : "catch {}"를 거의 사용하지 않아야합니다. 모든 예외가 숨겨집니다.예외는 당신이 그들을 볼 수 없기 때문에 사라지지 않습니다. –

+2

그는 잘 했어 // 뭔가를 할 –

+4

-1 ?? 나는 {}을 잡지 않았습니다. 나는 그 (것)들을 위해 ... 무언가를하기 위하여 거기에있는 코멘트가 있었다. 그들이해야 할 일을 어떻게 알았습니까? –

0

Timeout 속성을 으로 설정하고 Send 호출로 throw 된 예외를 처리 할 수 ​​있습니다. 그런 다음 적절하게 예외의 원인을 처리해야하지만 스레드를 잠그지는 않습니다.

관련 문제