네트워크나 로그인 문제와 무관한 SMTP Net::ReadTimeout - SMTP 호스트가 단순히 느림

안녕하세요,

몇 주 전부터 Discourse 인스턴스에서 이메일을 보내는 작업이 실패하고 있습니다. SMTP 설정은 변경되지 않았고, curl 테스트는 여전히 작동하지만 눈에 띄게 느립니다. 메일 전송에 사용해야 하는 호스터의 SMTP 서버는 일관되게 7초의 전송 시간을 기록하고 있습니다.

cat testmail | curl -vvv --url 'smtp://smtp.<HOST>:587' --mail-from mail@<DOMAIN> --mail-rcpt <ME> --user "mail@<DOMAIN>:<PW>" -T -

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying <IP>...
* Connected to smtp.<HOST> (<IP>) port 587 (#0)
< 220 mailproxy1.<HOST> Dovecot ready.
> EHLO ecm2
< 250-mailproxy1.<HOST>
< 250-8BITMIME
< 250-AUTH PLAIN LOGIN
< 250-BURL imap
< 250-ENHANCEDSTATUSCODES
< 250-SIZE
< 250-STARTTLS
< 250 PIPELINING
> AUTH PLAIN
< 334 
> xxxxxx=
  0     0    0     0    0     0      0      0 --:--:--  0:00:06 --:--:--     0< 235 2.7.0 Authentication successful
  0     0    0     0    0     0      0      0 --:--:--  0:00:07 --:--:--     0> MAIL FROM:<mail@<DOMAIN>>
< 250 2.1.0 Ok
> RCPT TO:<<ME>>
< 250 2.1.5 Ok
> DATA
< 354 End data with <CR><LF>.<CR><LF>
} [89 bytes data]
100    89    0     0    0    89      0     11 --:--:--  0:00:07 --:--:--    20< 250 2.0.0 Ok: queued as 356C3288C85
100    89    0     0    0    89      0     11 --:--:--  0:00:07 --:--:--    26
* Connection #0 to host smtp.<HOST> left intact

이것을 내부 메일 서버와 비교해 보았는데, 내부 서버는 메일당 1초 미만으로 처리됩니다. 메일 호스터의 7초 지연은 큰 문제가 되지 않을 수 있지만, (경우에 따라 하드코딩된 것으로 보이는) 5초 타임아웃을 늘릴 수 있는 설정을 찾지 못했습니다. open_timeout 그리고 제 생각에는 더 관련이 있을 것 같은 read_timeout도 /admin/email의 테스트 인터페이스에서 확인할 수 있습니다:

  • Docker 앱 컨테이너의 타이밍은 로컬 테스트 또는 Docker 호스트에서의 테스트와 동일합니다.
  • cURL로 전송된 메일은 (7초 대기 + 순식간의 처리 시간 후에) 올바르게 전달됩니다.
  • 사생활 보호상의 이유로, sendgrid, mailgun 등 일반적인 우회책은 아쉽게도 선택지가 아닙니다.
  • ActionMailer 7.0.x로의 전환이 이 문제를 일으킨 것일까요?

read_timeout을 구성하는 방법에 대한 아이디어를 주시면 감사하겠습니다.

1개의 좋아요

이를 위해 다음 파일에 새로운 설정을 추가해야 합니다.

즉, 다음과 같이 보이도록 해야 합니다.

  if GlobalSetting.smtp_address
    settings = {
      address: GlobalSetting.smtp_address,
      port: GlobalSetting.smtp_port,
      domain: GlobalSetting.smtp_domain,
      user_name: GlobalSetting.smtp_user_name,
      password: GlobalSetting.smtp_password,
      authentication: GlobalSetting.smtp_authentication,
      enable_starttls_auto: GlobalSetting.smtp_enable_start_tls,
+     open_timeout: GlobalSetting.smtp_open_timeout,
+     read_timeout: GlobalSetting.smtp_read_timeout
    }

변경 사항을 포함하여 풀 리퀘스트를 만들어 주실 수 있을까요?

2개의 좋아요

Falco님,

빠른 답변 주셔서 감사합니다. 말씀하신 대로, 해당 변경 사항이 적용되었습니다:

  • app.yml의 새로운 타임아웃이 표시되고 있습니다.
  • 이메일을 전송할 수 있습니다.

제 Ruby 실력이 거의 전무해서, 풀 리퀘스트를 준비하는 데 최선을 다해 보겠습니다. 도움 주시고, Discourse 커뮤니티에 항상 감사드립니다.

감사합니다.

Roland 드림

2개의 좋아요

PR가 공개되었습니다: Allow configuration of smtp timeout settings - Pull Request #17863 - discourse/discourse - GitHub

PR을 어떻게/어떻게 개선할 수 있는지 의견을 주시면 감사하겠습니다.

4개의 좋아요

PR에 CLA 서명만 있으면 병합할 수 있습니다.

2개의 좋아요

죄송합니다, 연휴가 길었습니다. 완료했습니다.

참고로, 그들은 스팸메일러를 억제하기 위해 의도적으로 이렇게 하고 있습니다. 대부분의 자동화된 스팸 도구도 5초 타임아웃을 가지고 있기 때문입니다.

1개의 좋아요

SMTP 서버 측의 지연이 너무 균일하기 때문에 정확히 이런 결과를 예상하고 있었습니다. 따라서 @Falco가 제안한 수정 사항, 즉 현재 PR#17863에 포함된 변경 사항은 더 많은 사용자에게 관련이 있을 수 있습니다.

core frontend (Headless Firefox) 단위 테스트에서 오류가 발생했습니다. 정확히 어떤 일이 일어나고 있는지 잘 모르지만, 이 오류가 우리의 변경 사항으로 인해 발생했을 것으로는 생각하지 않습니다.

1개의 좋아요

PR과 테스트 감사합니다. 이제 병합되었습니다.

1개의 좋아요

이 주제는 4일 후 자동으로 닫혔습니다. 더 이상 답변을 작성할 수 없습니다.