SMTP 타임아웃 연장

Discourse가 SMTP 서버가 이메일 메시지가 제출되었음을 확인하는 응답을 반환할 때까지 대기하는 타임아웃 간격을 연장하는 방법이 있을까요? 아니면, Discourse가 이 확인을 요구하지 않도록 구성할 수 있는 방법이 있을까요?

현재 Discourse 인스턴스가 중복 이메일을 생성하는 문제를 겪고 있습니다. 이메일을 전달하도록 제출할 때 Discourse가 Net::Timeout 오류를 받고 있습니다. 실제로는 이메일 제공업체가 이메일을 전달하고 있지만, Discourse는 이를 알지 못하여 이메일을 다시 전송합니다. 이 과정이 끝없이 반복됩니다.

최근 SMTP 타임아웃 커스터마이징 기능을 추가했지만, 이는 실제 SMTP 연결 설정에 관한 것입니다:

연결이 설정된 이후의 문제, 즉 전송 트랜잭션 타임아웃에 관한 문제인 것 같습니다.

네, 제가 파악한 바로는 그렇습니다. 연결은 설정되고, 이메일 메시지도 제출되지만, 그 후에 Net::Timeout 오류가 보고됩니다.

discourse_doctor 스크립트를 사용하면, 전환이 성공할 때 반환되는 메시지 ID와 실패할 때 발생하는 Net::Timeout 오류를 확인할 수 있습니다.

이 문제는 Discourse 2.9.0.beta5로 업데이트한 후에 발생했습니다. 해당 업데이트로 인해 Discourse가 이 오류에 대해 덜 관대해졌다고 추측합니다.

mail과 net/smtp Ruby gem에서 관련 변경 사항을 찾을 수 없었습니다. 혹시 SMTP 서버에 문제가 있는 것은 아닌가요? 다른 서버로 이전하는 것이 가능할까요?

확인해 주셔서 감사합니다. 동의합니다. 제 이메일 제공업체가 문제의 원인인 것 같습니다. 이메일 제출 후 응답이 충분히 빠르게 이루어지지 않기 때문입니다. 문제의 원인은 어떻게든 부하(load)와 관련이 있을 것이라고 추정할 수밖에 없습니다. 어떤 날에는 문제가 발생하지 않기 때문입니다.

여러 가지 이유로 이메일 제공업체를 변경하는 것은 상당한 도전 과제입니다. Discourse를 설정하여 이 문제를 우회하는 방법을 찾는 것이 가장 매력적인 해결책입니다.

새로운 메일 제공업체로 전환하는 것이 이 문제를 해결하는 유일한 방법처럼 보이지만, 이를 위해서는 내 도메인 전체의 메일 제공업체를 다시 구성해야 하며, 이는 내가 피하고 싶은 작업입니다.

Discourse의 발신 메일 처리 코드를 수정하여 과거와 같이 메일 제출 실패를 무시하도록 할 수 있는 방법이 있을까요? 저는 Rails 개발자가 아니기 때문에 어디서부터 시작해야 할지 막막합니다. 향후 Discourse 업데이트를 받을 수 있는 능력을 해치고 싶지 않습니다.

위와 같은 발언의 근거는 무엇인가요? 도메인/서브도메인당 하나의 인프라 세트에 대해서만 메일을 수신할 수 있지만, 여러 서비스가 해당 도메인 이름으로 이메일을 릴레이할 수는 있습니다.

또는 인스턴스에 전념하는 새로운 서브도메인을 설정할 수도 있는데, 이 경우 구성을 위해 재빌드조차 필요하지 않습니다.

과거에 한 번 시도해 본 적이 있었는데, 설정을 잘못해서 해결하지 못했기 때문에 아무것도 바꾸는 것을 꺼리고 있습니다. 또한 Discourse 이메일이 제 회사 도메인에서 발송되기를 원하지만, 더 이상 그렇게 할 수 없으므로, 말씀하신 대로 발신용 이메일에 서브도메인을 사용하도록 다시 시도해 보겠습니다.

RackSpace Cloud를 사용하여 이메일 서브도메인을 생성했고, Mac에서 Apple Mail과 curl을 통해 해당 도메인으로 메일을 보낼 수 있음을 확인했습니다. 또한 서버에서 curl을 사용하여 메일을 보낼 수도 있음을 확인했습니다. 그러나 discourse-doctor에서 다음 오류가 발생합니다:

Testing sending to support@latenightsw.com using secure.emailsrvr.com:465, username:username with plain auth.
======================================== ERROR ========================================
                                    UNEXPECTED ERROR

Net::ReadTimeout

====================================== SOLUTION =======================================
This is not a common error. No recommended solution exists!

Please report the exact error message above to https://meta.discourse.org/
(And a solution, if you find one!)

제 app.yml 파일에는 다음 설정이 포함되어 있습니다:

  DISCOURSE_SMTP_ADDRESS: secure.emailsrvr.com         # (mandatory)
  DISCOURSE_SMTP_PORT: 465                             # (optional)
  DISCOURSE_SMTP_USER_NAME: username      # (optional)
  DISCOURSE_SMTP_PASSWORD: password               # (optional, WARNING the char '#' in pw can cause problems!)

  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  

이 설정은 여기에 문서화된 구성과 일치합니다.

DISCOURSE_SMTP_ENABLE_START_TLS을 false로 설정해 보았습니다. Net::ReadTimeout 오류에 대한 다른 게시물에서는 이 설정을 시도해 보라고 제안하지만, 이렇게 해봤는데 차이가 없었습니다:

  DISCOURSE_SMTP_AUTHENTICATION: "login"
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

이 실패를 어떻게 진단할 수 있을까요?

@Falco 이 변경 사항을 Discourse 설정에 어떻게 적용하나요? app.yml 파일에 추가할 수 있는 설정에 대한 문서를 찾을 수 없어요.