아래 글의 어조가 다소 강할 수 있어 미리 양해의 말씀을 드립니다. 저도 조금 지쳐서 그런 말투가 나온 것입니다.
Michael Brown 님이 Discourse Meta에서 2022년 7월 27일 14:06에 작성:
죄송합니다. 이제야 내용을 파악하고 있는데, 몇 가지 생각이 있어서 적어봅니다. 일부는 이미 다뤄진 내용이기도 하고요…
여기서 어려운 점은 Discourse에서 외부로 발송되는 것이 수신된 메시지와는 다른 메시지라는 것입니다. 여기에는 다른 메타데이터(이 목적상 To/From/Reply-to/Unsubscribe 등)와 다른 본문(사용자별로 커스터마이징된 것으로 보입니다? 메일링 리스트 모드에서는 이것이 발생하지 않는 건가요?)이 포함됩니다.
정확히 메시지는 무엇일까요? 5322 규격을 절대 기준으로 삼아보자면:
메시지는 헤더 필드로 구성되며, 선택적으로 메시지 본문을 포함할 수 있습니다.
“Message-ID:” 필드는 특정 메시지의 특정 버전을 가리키는 고유한 메시지 식별자를 제공합니다.
[강조는 필자]이 "특정 버전"이라는 표현 때문에, 다른 Message-ID를 사용하여 수신된 메시지를 재전송하는 것은 적절하지 않다고 생각합니다. 다만, Discourse를 "포럼 소프트웨어"가 아닌 "메일링 리스트 소프트웨어"로 보는 관점으로 전환하면 그렇게 하는 것이 어느 정도 합리적이므로, 왜 그렇게 생각하시는지 이해는 합니다.
글쎄요, 안타깝게도 이것은 지나치게 문자 그대로의 해석, 혹은 존재하지 않는 문맥을 읽는 것에서 비롯된 것 같습니다.
모든 이메일 메시지는 메일 시스템이 이를 전달하는 과정에서 헤더가 수정됩니다. 적어도 Received: 헤더는 각 단계에서 추가되고, 여러 시스템은 스팸 필터링 결과와 서명을 나타내는 다양한 헤더를 추가합니다. 이러한 것들은 message-id 변경을 유발하지 않으며, 실제로 그렇게 하면 message-id가 완전히 기능을 상실하게 됩니다.
내용에 관해서는 이미 언급했듯이, 거의 모든 메일링 리스트는 본문 텍스트에 내용을 추가합니다. 보통 리스트 관리 페이지 링크나 구독 해지 링크가 포함된 푸터입니다. 이것들도 message-id 변경을 유발하지 않습니다.
사실, 메시지를 전달하는 거의 모든 것이 message-id를 변경하지 않습니다. 그렇게 하면 최종 사용자 클라이언트에서의 스레딩(threading)과 중복 제거가 깨지기 때문입니다.
제가 바로 인용하려던 내용을 인용하고 계시네요. ![]()
5322에는 또한 다음과 같이 명시되어 있습니다:
메시지가 "변경"되는 경우가 많지만, 그러한 변경은 해당 메시지의 새로운 인스턴스로 간주되지 않으므로, 메시지는 새로운 메시지 식별자를 받지 않습니다. 예를 들어, 메시지가 전송 시스템에 도입될 때 추적 필드(3.6.7절 참조)와 재전송 필드(3.6.6절 참조)와 같은 추가 헤더 필드가 앞에 붙는 경우가 많습니다. 이러한 헤더 필드의 추가는 메시지의 동일성을 변경하지 않으므로 원래의 “Message-ID:” 필드가 유지됩니다. 모든 경우에서, 메시지의 발신자가 전달하고자 하는 의미(즉, 이것이 동일한 메시지인지 다른 메시지인지)가 “Message-ID:” 필드가 변경되는지 여부를 결정하며, 메시지에 나타나는(또는 나타나지 않는) 특정 구문적 차이가 아닙니다.
결국 메시지의 발신자가 Discourse를 통해 메시지를 발송할 때 변경되는지 여부에 달려있다고 생각합니다.
여기서 오해하신 것 같습니다. 강조하겠습니다:
모든 경우에서, 메시지의 발신자가 전달하고자 하는 의미(즉, 이것이 동일한 메시지인지 다른 메시지인지)가 "Message-ID:"
필드가 변경되는지 여부를 결정합니다
_발신자_는 Discourse와 같은 MTA(메일 전송 에이전트)가 아니라 작성자입니다.
제가 이메일로 Discourse에 게시글을 올리면, 제 메시지가 의미적으로 그대로 독자에게 전달되기를 바랍니다. 구독 해지 링크와 같은 부가적인 내용은 제가 메시지에서 말한 것의 의미론적 내용을 변경하지 않습니다.
여전히 _동일한 메시지_입니다.
아마도 Resent-Message-ID와 같은 필드를 사용해야 하지 않을까요?
절대 아닙니다. 그것들은 _사용자_가 메시지를 재제출할 때 사용하는 것입니다. 예를 들어, 제가 메시지를 다른 사람에게 전달(forward)할 때 말입니다. 메일 릴레이(리스트와 Discourse와 같은)를 위한 것이 아닙니다.
처음부터 822 규격까지 항상 있었습니다. 다만 나중에 말씀하신 대로 업데이트는 되었습니다.
아프네요. 그때는 USENET 전용인 줄 알았습니다. 제가 잘못 알고 있었습니다.
5322는 또한 Discourse와 Github가 사용하는 방식에 대해 직접적으로 언급합니다:
“In-Reply-To:” 필드는 새로운 메시지가 답장인 메시지(또는 메시지들)를 식별하는 데 사용될 수 있으며, “References:” 필드는 대화의 "스레드"를 식별하는 데 사용될 수 있습니다.
아마도 약간 부적절하게, “Thread Identifier” 헤더의 부재로 인해 그렇습니다. 하지만 이 해석이 RFC 작성자의 의도와 일치하지 않을 수 있습니다… "References"는 있지만 "In-Reply-To"는 없는 메시지에 대해서는 다루지 않고 있습니다.
저에게는 두 필드가 동일한 정보를 다루는 것으로 보입니다:
References는 OP(첫 번째 게시물)까지의 선형(보통) 스레드를 보여줍니다.In-Reply-To는 부모 메시지를 보여주고, OP까지의 이전 메시지와 함께 동일한 스레드를 암시합니다.
여기서 까다로운 부분은 하나의 이메일을 발송하는 것이 아니라, 수신자별로 하나씩 N개를 발송한다는 것입니다. 그렇게 해야 개별 메타데이터(Unsubscribe 등)가 정확해지니까요.
이것은 까다로운 문제가 아닙니다. 메시지의 의미는 동일하며, 커스터마이징은 사소하고 의미론적으로 무관합니다. 그것들은 새롭거나 서로 다른 message-id를 정당화하지 않습니다.
그리고 네, 테스트 중에 스팸 판정이 Message-ID와 연결될 것이라는 강력한 징후를 보았습니다. 나중에 다시 발견되면(같은 사용자 또는 다른 사용자) 스팸으로 분류될 가능성이 훨씬 더 높아졌거든요.
이러한 사례를 몇 가지 보여줄 수 있을까요? message-id는 최종 사용자 측에서 중복 제거를 허용하기 때문입니다. 또한 많은 “안티스팸” 조치가 잘못된 엉터리라는 점을 명심하십시오. 터무니없는 이유로 잠재적 스팸으로 거부당한 것들이 얼마나 많은지… 깨진 스팸 오분류 문제를 우회하기 위해 이메일을 깨뜨리는 것은 현명한 선택이 아닙니다.
오늘날까지 저는 GMail 주소를 가진 사람들에게 CC를 보내지 않습니다. GMail의 스팸 필터링은 저를 알고 있고 메시지를 그냥 버리거든요. 리스트에만 보내면 그들은 메시지를 받습니다. GMail 주소를 CC로 추가하면 (a) 스팸으로 표시되고 (b) 메일링 리스트 메시지도 또 스팸으로 표시됩니다(동일한 message-id!). 최종 사용자는 제 메시지를 볼 수 없습니다. 이 논리는 완전히 터무니없고 수정 불가능합니다.
[quote=“Cameron Simpson, post:22, topic:233499,
username:cameron-simpson”]
수신자별 구독 해지 링크를 추가하고 원래의 message-id를 유지하는 것에 대해 저는 완전히 괜찮습니다. 각 메시지 사본에 개별 message-id를 부여하여 스레딩을 잃는 것보다 이득이 훨씬 훨씬 큽니다.
[/quote]솔직히 말하면, 여기에서의 이득은 특정 메일 클라이언트에서 이메일을 올바르게 스레딩하는 것에 전적으로 관련되어 있으며, 이는 전달률(deliverability)을 희생하는 것입니다.
아쉬운 한숨. 모든 메일 클라이언트에 해당합니다. 그리고 Python 커뮤니티 쪽에서 Discourse로 오지 않겠다고 말하는 주요 이유 중 하나는 이메일 쪽 스레딩이 깨져 있기 때문입니다. 많은 사람들이 포럼을 사용하지 않습니다. 각 포럼을 _방문_해야 하니까요. 이메일은 사용자에게 옵니다. 그들은 자기들이 선호하는 리더와 자기들이 선호하는 에디터를 사용할 수 있고, 스레딩은 사람들이 토론의 흐름을 명확하게 볼 수 있게 해줍니다. 제대로 작동할 때 말입니다.
현재의
topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id}는 적어도 사용자의 메일함에서 일관성을 유지합니다. 그 전제에 따르면제 가장 큰 우려는 전달률입니다 - 주요 제공업체로부터 가시성이 전혀 없는 상황에서 이메일을 전달하는 것은 이미 어려운 일입니다.
증거를 보고 싶습니다. 메일링 리스트는 전 세계적으로 이를 올바르게 처리합니다. Discourse는 분명하고 객관적으로 이를 깨뜨립니다. 저는 이를 수정하려고 노력하고 있습니다.
여기서 두 가지 근본적인 문제를 다시 강조하겠습니다:
- OP의
In-Reply-To와References는 가상의 “OP 이전” “토픽” message-id를 인용하므로, 이메일 사용자는 시작 메시지(OP)가 있는 스레드를 갖지 못합니다 - OP를 포함하여 _모든 것_이 후속 답변처럼 보입니다. - Discourse를 통해 수신된 이메일과 CC 등을 통해 직접 수신된 이메일은 의미론적으로 동일한 메시지임에도 불구하고 다른 message-id를 가지고 있습니다. 이는 스레딩과 중복 제거를 깨뜨립니다.
하지만 메일링 리스트 모드에서 Discourse가 메일링 리스트 소프트웨어처럼 더 많이 행동하도록 만드는 것에 대한 강력한 논리는 봅니다. @martin 메일링 리스트 모드에서는 메시지 본문을 커스터마이징하지 않는다고 믿습니다. 메일링 리스트 모드에서 Message-ID를 보존하고 재사용하는 것에 대해 더 엄격한 접근을 취하는 것이 합리적이라고 생각하시나요?
Python 커뮤니티 쪽에는 "메일링 리스트 모드"가 너무 많은 정보 홍수(firehose)라고 느끼는 사람들이 있습니다. 그들은 모든 것이 아니라 대상화된 토픽에 대한 이메일만 받고 싶어합니다. message-id 처리는 이메일 쪽의 모든 경우에 동일해야 합니다.
저는 discuss.python.org에서 "메일링 리스트 모드"를 사용하는 사람입니다. 하지만 여기(discourse.org)에서는 켰다가 _즉시 다시 껐습니다. 여기서는 대상화된 모드가 필요합니다.