이전 후 '이메일로 답장' 기능이 작동하지 않습니다

안녕하세요,

자체 호스팅한 Discourse 인스턴스를 하나의 서버에서 다른 서버로 이전했습니다. ‘이메일로 답장’ 및 '이메일로 새 게시글 허용’을 포함한 모든 설정이 기존 시스템에서 새 시스템으로 이전되었습니다. 이메일 처리에는 discourse/mail-receiver 설정을 사용하고 있습니다.
기존 시스템에서는 답장(reply-to) 기능과 새 이메일 게시 기능 모두 정상적으로 작동했지만, 새 서버에서는 답장 기능이 작동하지 않는 문제가 있습니다.

  1. 미확인 사용자(unknown user)로 해당 목적에 설정된 이메일 주소로 이메일을 보내면, 메일이 수신되는 것을 확인할 수 있습니다. 새로운 스테이징 사용자가 생성되며 메시지가 게시됩니다. 좋습니다!
  2. 팀 사용자(Team user)로 이 메시지에 답장하면, 메시지가 올바르게 전달됩니다. 훌륭합니다!
  3. 그러나 그 이메일에 다시 답장하면(이것은 Discourse에서 답장으로 이어져야 합니다) 실패합니다. 메시지가 mail-receiver에 도착하면 API를 통해 전달을 시도하지만, 다음과 같은 로그 오류와 함께 실패합니다.

(개인정보 보호를 위해 사용자 이름과 도메인 이름을 수정했습니다)

<22>Sep 13 09:45:15 postfix/qmgr[81]: AF8665CA560: from=<test-user@outside-org.nl>, size=9233, nrcpt=1 (queue active)
<23>Sep 13 09:45:15 receive-mail[144]: Recipient: 6ffb2772c3b09bf60fc2705753fb32ce@forum.acme.org
<19>Sep 13 09:45:15 receive-mail[144]: Failed to POST the e-mail to https://forum.acme.org/admin/email/handle_mail: 400
<22>Sep 13 09:45:15 postfix/pipe[143]: AF8665CA560: to=<6ffb2772c3b09bf60fc2705753fb32ce@forum.acme.org>, relay=discourse, delay=1126, delays=1126/0.01/0/0.21, dsn=4.3.0, status=deferred (temporary failure)

말씀드린 대로, 이 전체 왕복 과정은 기존 설정에서는 완벽하게 작동했습니다. 새 설정(local_discourse/app 및 local_discourse/mail-receiver)은 기존 설정과 정확히 동일합니다.

  • 답장 이메일에서 handle_mail API가 400 오류를 발생시키는 이유가 무엇인지 알 수 있을까요?
  • 더 깊이 파고들 수 있도록 로깅을 더 자세히 출력하도록 설정할 수 있을까요?

관리자 - 이메일 - 거부된 항목에서 더 많은 정보를 찾을 수 있어야 합니다.

아니요, 죄송하지만 거절(Rejected) 상태로조차 표시되지 않습니다. 400 Bad Request 오류와 충돌하기 때문인 것 같습니다…

'새 메일’과 '답장 메일’의 차이가 무엇인지 궁금합니다. 제 생각에는 유일한 관련 있는 차이가 수신자일 것 같습니다. 하지만 둘 다 동일한 핸들러(mail-receiver)를 거쳐 동일한 API(https://forum.acme.org/admin/email/handle_mail)로 전송됩니다.

이 부분도 함께 마이그레이션했나요? MX 레코드를 그에 맞게 업데이트했나요?

포럼의 호스트 이름을 변경했나요?

  • 메일 수신기도 마이그레이션되었습니다.
  • 호스트네임은 동일합니다.

문제는 MX 부분에 있는 것이 아닙니다. 로그에 따르면 메일은 실제로 메일 수신기에 도착하지만, 메일을 API에 제출하는 순간 400(잘못된 요청) 응답을 받습니다.

다만 설정에는 차이가 있습니다. ‘임시 오프라인’ 기능을 얻기 위해 nginx 리버스 프록시를 앞에 배치했고, 같은 호스트에 다른 웹사이트도 호스팅할 수 있도록 했습니다. 그런데 새 토픽이 문제없이 정상적으로 접수되고 있으니, 이것이 문제가 될 이유가 무엇인지 여전히 이해가 되지 않습니다. 그래도 일단 리버스 프록시를 제거해 보면 어떻게 될지 확인해 보겠습니다…

업데이트
아쉬운 결과입니다! Discourse 설치를 nginx 리버스 프록시 뒤에서 빼냈습니다(기본적으로 app을 올바른 설정으로 다시 빌드하고 nginx를 종료한 것입니다) 하지만 이 조치로 문제가 전혀 해결되지 않았습니다!
이제 정말 막막합니다. 도대체 무슨 일이 일어나고 있는 걸까요?

요약하면:

  • 이전 Discourse 설치 환경(app 및 메일 수신기)에서는 새 토픽과 답변 모두 정상적으로 접수되었습니다.
  • 새 서버로 마이그레이션한 후(모든 환경이 동일합니다) 새 토픽은 여전히 정상 접수되지만, 답변은 400 Bad Request 오류로 거부되고 있습니다.

이 상황을 유발하는 문제를 찾았습니다.
여러 메일 클라이언트를 사용해보던 중, 데스크톱 클라이언트(Thunderbird)로 보낸 메일에는 ‘400 Bad Request’ 오류가 발생했지만, 웹 클라이언트를 사용하면 응답이 정상적으로 도착하는 것을 발견했습니다.
더 자세히 조사해보니 Thunderbird는 답변 시 Western (Windows-1252) 인코딩으로 전환되는 반면, 웹 클라이언트는 UTF-8을 유지하고 있었습니다. Thunderbird에서 UTF-8 사용을 강제하자 메일이 정상적으로 전달되었습니다.

Thunderbird, 메일 전달 실패

Content-Type: text/plain; charset=windows-1252; format=flowed
Content-Transfer-Encoding: 7bit

웹 메일

Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit

Thunderbird, 메일 전달 성공

Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

메일 수신 측에서 인코딩 검사 및 정제(sanitizing)를 수행해야 한다고 생각합니다. 하지만 저는 Ruby 개발자가 아니므로, 해당 코드 부분은 개발자분들에게 맡기겠습니다. :smiley: