자체 호스팅한 Discourse 인스턴스를 하나의 서버에서 다른 서버로 이전했습니다. ‘이메일로 답장’ 및 '이메일로 새 게시글 허용’을 포함한 모든 설정이 기존 시스템에서 새 시스템으로 이전되었습니다. 이메일 처리에는 discourse/mail-receiver 설정을 사용하고 있습니다.
기존 시스템에서는 답장(reply-to) 기능과 새 이메일 게시 기능 모두 정상적으로 작동했지만, 새 서버에서는 답장 기능이 작동하지 않는 문제가 있습니다.
미확인 사용자(unknown user)로 해당 목적에 설정된 이메일 주소로 이메일을 보내면, 메일이 수신되는 것을 확인할 수 있습니다. 새로운 스테이징 사용자가 생성되며 메시지가 게시됩니다. 좋습니다!
팀 사용자(Team user)로 이 메시지에 답장하면, 메시지가 올바르게 전달됩니다. 훌륭합니다!
그러나 그 이메일에 다시 답장하면(이것은 Discourse에서 답장으로 이어져야 합니다) 실패합니다. 메시지가 mail-receiver에 도착하면 API를 통해 전달을 시도하지만, 다음과 같은 로그 오류와 함께 실패합니다.
'새 메일’과 '답장 메일’의 차이가 무엇인지 궁금합니다. 제 생각에는 유일한 관련 있는 차이가 수신자일 것 같습니다. 하지만 둘 다 동일한 핸들러(mail-receiver)를 거쳐 동일한 API(https://forum.acme.org/admin/email/handle_mail)로 전송됩니다.
다만 설정에는 차이가 있습니다. ‘임시 오프라인’ 기능을 얻기 위해 nginx 리버스 프록시를 앞에 배치했고, 같은 호스트에 다른 웹사이트도 호스팅할 수 있도록 했습니다. 그런데 새 토픽이 문제없이 정상적으로 접수되고 있으니, 이것이 문제가 될 이유가 무엇인지 여전히 이해가 되지 않습니다. 그래도 일단 리버스 프록시를 제거해 보면 어떻게 될지 확인해 보겠습니다…
업데이트
아쉬운 결과입니다! Discourse 설치를 nginx 리버스 프록시 뒤에서 빼냈습니다(기본적으로 app을 올바른 설정으로 다시 빌드하고 nginx를 종료한 것입니다) 하지만 이 조치로 문제가 전혀 해결되지 않았습니다!
이제 정말 막막합니다. 도대체 무슨 일이 일어나고 있는 걸까요?
요약하면:
이전 Discourse 설치 환경(app 및 메일 수신기)에서는 새 토픽과 답변 모두 정상적으로 접수되었습니다.
새 서버로 마이그레이션한 후(모든 환경이 동일합니다) 새 토픽은 여전히 정상 접수되지만, 답변은 400 Bad Request 오류로 거부되고 있습니다.
이 상황을 유발하는 문제를 찾았습니다.
여러 메일 클라이언트를 사용해보던 중, 데스크톱 클라이언트(Thunderbird)로 보낸 메일에는 ‘400 Bad Request’ 오류가 발생했지만, 웹 클라이언트를 사용하면 응답이 정상적으로 도착하는 것을 발견했습니다.
더 자세히 조사해보니 Thunderbird는 답변 시 Western (Windows-1252) 인코딩으로 전환되는 반면, 웹 클라이언트는 UTF-8을 유지하고 있었습니다. Thunderbird에서 UTF-8 사용을 강제하자 메일이 정상적으로 전달되었습니다.