Заранее приношу извинения за тон некоторых нижеприведённых слов. Я звучу раздражённо, потому что немного раздражён.
Автор: Майкл Браун, через Discourse Meta, 27 июля 2022 г., 14:06:
Извините, я только сейчас догоняю события, вот некоторые мысли, часть из которых уже была рассмотрена…
Сложность здесь в том, что то, что отправляется из Discourse наружу, — это другое сообщение, чем входящее. У него другие метаданные (в данном случае: To/From/Reply-to/Unsubscribe и т. д.) и другое тело (оно настраивается для каждого пользователя (думаю? Разве этого не происходит в режиме рассылки?)).
Что именно представляет собой сообщение? Если следовать RFC 5322 буквально:
Сообщение состоит из заголовков, за которыми необязательно следует тело сообщения.
Поле “Message-ID:” предоставляет уникальный идентификатор сообщения, который относится к конкретной версии конкретного сообщения.
[выделение моё]Именно фраза “конкретная версия” заставляет меня думать, что было бы неуместно повторно отправлять входящее сообщение с другим Message-ID. Хотя, если сменить точку зрения: рассматривать Discourse не как “программное обеспечение для форумов”, а как “программное обеспечение для рассылки”, то это в какой-то мере имеет смысл, поэтому я понимаю вашу позицию.
К сожалению, это основано на чрезмерно буквальном прочтении, возможно, на чтении контекста, которого нет.
Каждое письмо получает модифицированные заголовки, когда почтовая система передаёт его дальше. Если не считать ничего другого, заголовки Received: добавляются на каждом шаге, а несколько систем добавляют различные заголовки, указывающие результаты фильтрации спама и подписи. Ни одно из этих действий не вызывает изменения message-id, и, более того, такое изменение сделало бы message-id полностью неработоспособным.
Что касается содержимого, как уже упоминалось, почти каждая рассылка добавляет контент в тело письма, обычно это подвал со ссылкой на страницу администрирования списка или ссылкой для отписки. Это также не вызывает изменения message-id.
Фактически, почти ничто из того, что пересылает сообщение, не меняет message-id. Потому что это сломало бы треддинг и обнаружение дубликатов для клиентских программ конечных пользователей.
Я вижу, что вы продолжаете цитировать то, что я как раз собирался привести ![]()
RFC 5322 также говорит:
Существует множество случаев, когда сообщения “изменяются”, но эти изменения не представляют собой новую инстанцию этого сообщения, и поэтому сообщение не получает новый идентификатор. Например, когда сообщения вводятся в транспортную систему, к ним часто добавляются дополнительные заголовки, такие как трассировочные поля (описанные в разделе 3.6.7) и поля повторной отправки (описанные в разделе 3.6.6). Добавление таких заголовков не меняет идентичность сообщения, и поэтому оригинальное поле “Message-ID:” сохраняется. Во всех случаях именно смысл, который отправитель сообщения хочет передать (то есть, является ли это тем же самым сообщением или другим сообщением), определяет, изменится ли поле “Message-ID:”, а не какие-либо конкретные синтаксические различия, которые появляются (или не появляются) в сообщении.
Я полагаю, всё сводится к вопросу: меняется ли отправитель сообщения, когда Discourse отправляет его наружу?
Кажется, вы здесь что-то неправильно поняли. Позвольте мне подчеркнуть:
Во всех случаях именно смысл, который отправитель сообщения
хочет передать (то есть, является ли это тем же самым сообщением или
другим сообщением), определяет, изменится ли поле "Message-ID:"
Отправитель — это автор, а не MTA, такой как Discourse.
Если я публикуюсь в Discourse через электронную почту, я хочу, чтобы моё сообщение достигло читателей в том виде, в котором оно есть, в семантическом смысле. Любые дополнения, такие как ссылки для отписки, не меняют семантику того, что я сказал в своём сообщении.
Это всё ещё то же самое сообщение.
Может быть, нам стоит использовать Resent-Message-ID и родственные поля?
Ни в коем случае. Они предназначены для пользователя, который повторно отправляет сообщение. Например, если я переслал сообщение кому-то другому. Они не предназначены для почтовых ретрансляторов (таких как списки рассылки и Discourse).
Оно всегда было там, ещё со времён RFC 822. Но, как вы позже сказали, да, оно было обновлено.
Ой. Я думал, что на тот момент это было только для USENET. Я ошибался.
RFC 5322 также напрямую говорит о том, как Discourse и GitHub его используют:
Поле “In-Reply-To:” может использоваться для идентификации сообщения (или сообщений), на которые отвечает новое сообщение, в то время как поле “References:” может использоваться для идентификации “потока” (thread) обсуждения.
Возможно, немного неправильно, вероятно, из-за отсутствия подходящего заголовка “Thread Identifier”. Но такая интерпретация может не соответствовать намерениям авторов RFC… она не решает проблему сообщений с полем “References”, но без “In-Reply-To”.
Для меня это означает, что оба поля охватывают одну и ту же информацию:
Referencesпоказывает линейную (обычно) ветку обратно к исходному посту (OP)In-Reply-Toпоказывает родительское сообщение и в совокупности с предыдущими сообщениями обратно к OP подразумевает тот же поток
Сложность этого момента в том, что мы отправляем не одно письмо, а N — по одному для каждого получателя — чтобы их индивидуальные метаданные (Unsubscribe и т. д.) были корректными.
Это не сложно. Смысл сообщений одинаков, кастомизации незначительны и семантически не важны. Они не требуют новых или отдельных message-id.
И да, во время тестирования я действительно видел сильные указания на то, что определение спама привязано к Message-ID. Если его позже увидят снова (того же пользователя или другого пользователя), он с гораздо большей вероятностью будет помечен как спам.
Можете показать некоторые из этих случаев? Поскольку message-id позволяют устранять дубликаты, это касается конечного пользователя. И имейте в виду, что многие меры “антиспама” — это заблуждения и мусор. Количество вещей, которые я получал отклонёнными как потенциальный спам по совершенно надуманным причинам… ломать работу электронной почты, чтобы обойти ошибочную фильтрацию спама — плохой выбор.
До сих пор я никогда не копирую людей с адресами GMail, потому что спам-фильтр GMail знает меня и отбрасывает сообщения. Если я отправляю только в список, они получают его. Если я копирую свой адрес GMail, он (а) помечает это как спам и (б) затем также помечает сообщение рассылки как спам (тот же message-id!). Конечный пользователь не видит моё сообщение. Эта логика абсолютно надуманна и неисправима.
[quote=“Cameron Simpson, post:22, topic:233499,
username:cameron-simpson”]
Так что я бы полностью согласился с тем, что вы добавляете ссылку для отписки, специфичную для получателя, и сохраняете оригинальный message-id. Преимущества гораздо-гораздо перевешивают потерю треддинга, если вы дадите каждой копии сообщения индивидуальный message-id.
[/quote]Честно говоря, преимущества здесь полностью связаны с правильным треддингом писем в определённых почтовых клиентах за счёт доставляемости.
Вздох. Для всех почтовых клиентов. И главная причина, по которой люди в Pythonland говорят, что просто не будут переходить в Discourse, заключается в том, что треддинг по электронной почте сломан. Многие люди не используют форумы, потому что каждый форум требует от них посещения. Электронная почта приходит к ним, они могут использовать свой предпочитаемый читалку и свой предпочитаемый редактор, и треддинг позволяет людям чётко видеть поток обсуждения. Когда это работает.
Текущий формат
topic/#{topic_id}/#{post_id}.s#{sender_user_id}r#{receiver_user_id}по крайней мере делает это последовательным для пользователя в его почтовом ящике. ПредположениеМоя главная забота — доставляемость: достаточно сложно доставить письмо, когда у основных провайдеров нет никакой видимости.
Я бы хотел увидеть доказательства. Списки рассылки делают это правильно по всему миру. Discourse определённо и объективно ломает это. Я пытаюсь это исправить.
Позвольте мне повторить две основные проблемы здесь:
- Исходный пост (OP) в полях
In-Reply-ToиReferencesссылается на фиктивный “до-OP” “topic” message-id, поэтому ни у одного пользователя электронной почты нет треда с исходным сообщением (OP) — всё, включая OP, выглядит как продолжение - Письма, полученные через Discourse, и письма, полученные напрямую, например, через CC, имеют разные message-id, хотя семантически это одно и то же сообщение; это ломает треддинг и обнаружение дубликатов
Но я вижу сильный аргумент в пользу того, чтобы заставить Discourse вести себя больше как программное обеспечение для рассылки в режиме рассылки. @martin, я полагаю, что мы не кастомизируем тело сообщения в режиме рассылки? Вы думаете, что имеет смысл采取 более строгий подход к сохранению и повторному использованию Message-ID в режиме рассылки?
Есть люди в Pythonland, которые нашли “режим рассылки” слишком интенсивным, как пожарный шланг. Они хотят получать письма по целевым темам, но не по всем. Обработка message-id должна быть одинаковой для всех сторон электронной почты.
Я человек “режима рассылки” на discuss.python.org. Но я включил его здесь (discourse.org) и *немедленно выключил снова. Мне нужен целевой режим здесь.}