-1

C#으로 작성된 클라이언트 응용 프로그램을 사용하여 대량 메일을 기업 Exchange 서버로 보냅니다.SMTP 시간 초과를 처리하는 방법

클라이언트 응용 프로그램 시간 초과 (서버가 아님)가 발생할 수 있습니다. 서버가 요청을 완료했는지 알 수있는 방법이 없으므로이 경우 재 시도를 처리하는 방법은 무엇입니까?

중복을 피하기 위해 사용할 수있는 ID는 없습니다. 긴 시간 초과 또는 무한 시간 제한 설정은 좋은 정책이 아닙니다.

재 시도를 위해 지수 백 오프 알고리즘을 사용하고 있습니다. 이 경우 다음 번에 더 오래 기다릴 것이므로 하나의 복제본 만 보내야합니다.

나는 총알 전문가 솔루션이 없다고 생각합니다. 어쨌든, 그것은 종류의 첫 번째 프로젝트이기 때문에, 나는 누군가가 내가 놓친 해결책을 가지고 있는지 확인해야합니다.

업데이트 : 교환 중입니다. SmtpClient를 사용하여 전자 메일을 보내고 있습니다. 문제는 서버가 250 Ok 메시지를 보낼 수 있지만 수신자가 메시지를받지 못하고 다시 시도하는 것입니다. 이것이 내가이 게시물에서 해결하려고하는 유일한 문제이다.

휴식 서비스에서 권장되는 방법은 동시성 오류를 사용하는 것입니다. 클라이언트가 뭔가를 게시하고 메시지가 이미 서버에 저장되었다는 의미 인 "409 - 충돌"상태가 발생하는 경우 그러나 거기에서 일어나는 일은 클라이언트가 생성하고 메시지의 일부인 메시지의 열쇠가되는 것입니다. SMTP가이를 막을 수있는 메커니즘이없는 것 같습니다.

답변

0

일반적으로 SMTP 서버는 표준 SMTP를 사용할 때 전자 메일을 수락했는지 여부를 알려줍니다.

enter image description here enter image description here

그래서 응용 프로그램은 여기에 응답을 추적해야하고 timesout이 일어날 경우 모든 이메일을 진행하지 않아도 그것을 중지 된 위치까지 선택해야 다음은 텔넷을 통해 예입니다 . 이 발신자 또는 수신자가 받아 밤은 일 수 있었다 같은 방법으로 응용 프로그램이

RFC 5321에서 언급 ... 때마다 응답을 확인해야합니다 (해당 문서에서 스크롤 할 수 있습니다) :

수신자 SMTP가 DATA에 대한 응답으로 "250 OK"메시지를 보내어 메일을 수락하면 메시지 배달 또는 중계를 위해 책임을 수락합니다. 이건 책임을 진지하게 받아 들여야합니다. 나중에 호스트가 크래시되거나 예측 가능한 리소스 부족으로 인해 과 같은 사소한 이유로 의 메시지가 손실되어서는 안됩니다. [...] 텍스트의 끝 부분이 성공적으로 수신되어 저장되면 SMTP 수신자는 "250 OK"답장을 보냅니다.

전자 메일을 보내고 있기 때문에 4.5.4.1 절을 생각해보십시오. 보내는 이메일을 처리하는 프레임 워크의 일부 종류를 사용하지 않는 경우 중요 할 수 있습니다 RFC가 준수합니다.

예 : 클라이언트가 전자 메일을 생성하고 있지만 본문 (전자 메일 전송의 마지막 부분)에서 전송하는 동안 클라이언트가 연결을 끊습니다.그런 다음 서버는 이메일을 계속 진행할 수 없습니다. 전문적으로 그는 모든 정보를 얻을 수는 있었지만 RFC는 클라이언트가 시간 제한을 갖고 전체 프로세스를 완료하지 않았으므로이를 발송할 수 없었습니다.

업데이트 : 가장 좋은 방법은 당신이 텔넷 예에서뿐만 아니라 볼 수있는 (= "이메일이 성공적으로 SMTP 서비스로 전송되었습니다.")는 smtpStatusCode 확인을 확인 후 C# SmtpClient method을 사용하는 것 . 방법은 여기에 다른 것을하지 않습니다 (기술적으로). 이 방법은 또한 RFC 5321을 준수하므로 smtp 전송 휠을 다시 작성할 필요가 없습니다. 확인을받지 못하면 그 동안 무언가 일어 났을 수 있으며 그 결과를 확인한 다음 다시 보내야합니다 (또는 오류 메시지가 전자 메일 주소가 유효하지 않다고 말하면 포기해야합니다. 무한 루프를 피하기위한 그런 것).

+0

합니다. 클라이언트 시간 초과가 발생하면 클라이언트가 서버 응답을 기다리는 것을 포기하고 요청을받지 못하기 때문에 요청의 결과를 알 수 없습니다. 예 : 통신이 끊어지면 서버가 끝까지 진행되지만 클라이언트는 응답을받지 못합니다. 다른 예를 들자면, 서버가 사용량이 많았 기 때문에 31 초 후에 요청을 처리했지만 클라이언트는 30 초 후에 응답을 보냈습니다. – ByteArtisan

+0

매우 간단합니다. 요즘 모든 SMTP 서버는 [RFC 5321] (https : //tools.ietf. org/html/rfc5321 # section-4.5.4.) _keep는 해당 URL을 스크롤 할 수 있다고 언급했습니다. 애플리케이션은 RFC 5321을 준수해야합니다. 그렇지 않으면 여러 전자 메일을 보내 게됩니다. 즉 진행이 중간에 끊어지면 서버가 전자 메일을 계속 진행할 수 없으며 단순히 작동하지 않고 RFC 5321에 위배됩니다. 즉, 응용 프로그램에서 RFC에 언급 된 250 OK를 얻은 다음 전자 메일 원격 서버가 수락했습니다. 그렇지 않은 경우 다시 보내야합니다. – BastianW

+0

우리가 같은 페이지에 있는지 잘 모르겠습니다. Microsoft Exchange 서버는 나를 위해 릴레이를 수행하도록 구성되어 있으므로 RFC 5321이이 서버에 의해 보장되어야합니다. 어떤 방식 으로든 RFC 5321을 준수해야합니까? 한 번에 하나의 메시지를 보내고 사전에 결과를 확인합니다. 오류가 발생하면 5 번 다시 시도하고 처음에는 문제가 발생했습니다. 시간 초과가 있다면 진행하는 법. – ByteArtisan

0

또 다른 가능한 옵션은 Microsoft Exchange Webservices입니다. 당신은 이메일을 보내기 위해서 그것들을 사용할 수 있습니다. here에서 예 :

// Create an email message and identify the Exchange service. 
EmailMessage message = new EmailMessage(service); 

// Add properties to the email message. 
message.Subject = "Interesting"; 
message.Body = "The merger is finalized."; 
message.ToRecipients.Add("[email protected]"); 

// Send the email message and save a copy. 
message.SendAndSaveCopy(); 

그들은뿐만 아니라 다시 응답을 제공 : 이해가 안

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <h:ServerVersionInfo MajorVersion="14" 
       MinorVersion="0" 
       MajorBuildNumber="639" 
       MinorBuildNumber="20" 
       Version="Exchange2010" 
       xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xm=""lns:xsd="http://www.w3.org/2001/XMLSchema" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
     <m:CreateItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items /> 
     </m:CreateItemResponseMessage> 
     </m:ResponseMessages> 
    </m:CreateItemResponse> 
    </s:Body> 
</s:Envelope>