Mensagens de e-mail do Discourse estão incorretamente encadeadas

Abre a porta para todo tipo de coisas que poderíamos fazer, como rejeitar e-mails respondendo a uma versão antiga de uma mensagem. Mas é imaginação e coisas que podem parecer uma boa ideia, mas não são necessariamente :smiley:

3 curtidas

Ainda não vi isso mencionado, então certifique-se de lidar com isso:

  • Se o e-mail incluir uma seção “Respostas Anteriores”, (faça algo para torná-la específica para o destinatário)

Não tenho certeza do que você quer dizer com respostas anteriores e como eu precisaria torná-la mais específica para o destinatário? Como isso se encaixa na estratégia mais ampla de Message-IDs consistentes que detalhamos aqui?

Se alguém recebe uma seção “Respostas Anteriores”, você precisa desistir completamente de IDs de mensagem consistentes: você está combinando várias postagens em um único e-mail! Não há um único ID de mensagem correto que identifique todo o conteúdo de forma consistente em múltiplos pontos de vista.

Editar: na verdade, você pode apenas concatená-los, eu acho?
topic/1234/post/12345.also-12340-12339

Além disso, isso torna os gatilhos de spam mencionados anteriormente ainda mais graves: você não está apenas trocando o link de cancelamento de inscrição sob o mesmo ID de mensagem, há palavras reais incluídas e excluídas em diferentes versões entregues com o mesmo ID de mensagem.

Por Kane York via Discourse Meta em 02Aug2022 04:26:

Se alguém recebe uma seção “Respostas Anteriores”, você precisa desistir completamente de IDs de mensagem consistentes: você está combinando várias postagens em um único e-mail!

Você pode elaborar um pouco sobre isso? Como fica o e-mail neste caso? Tem um exemplo?

Não há um único ID de mensagem correto que identifique todo o conteúdo de forma consistente em múltiplos pontos de vista.

É o suficiente escolher apenas um, como o primeiro, para a maioria dos propósitos. se este exemplo ainda for uma resposta.

Edição: na verdade, você pode simplesmente concatená-los, eu acho?
topic/1234/post/12345.also-12340-12339

Estou começando a pensar que você está confundindo algum tipo de referência a postagens de origem do fórum Discourse com o message-id. O message-id identifica mensagens de e-mail. Para uma postagem de resposta, o message-id em In-Reply-To e References deve corresponder ao message-id das mensagens de e-mail antecedentes relevantes. Quando alguém faz uma postagem em um tópico, todas as cópias dessa postagem enviadas por e-mail para aqueles que solicitaram cópias por e-mail devem ter o mesmo message-id.

Além disso, isso torna os gatilhos de spam mencionados anteriormente ainda mais graves: você não está apenas trocando o link de cancelamento de inscrição sob o mesmo ID de mensagem, há palavras reais incluídas e excluídas em diferentes versões entregues com o mesmo ID de mensagem.

Não há nada de errado com isso, se estes são “rodapés administrativos” na parte inferior da postagem.

Não tenho certeza se estamos falando da mesma coisa.

Além disso: quais gatilhos de spam específicos você está discutindo aqui? Porque e-mails “ligeiramente diferentes” são enviados o tempo todo no mundo real.

Saudações,
Cameron Simpson cs@cskk.id.au

1 curtida

Kane está falando sobre esta opção:

Os usuários podem optar por receber respostas anteriores com grande fidelidade anexadas ao final dos e-mails.

Estou feliz em considerar isso como ruído de fundo por enquanto e tratá-lo de forma semelhante a como tratamos os links exclusivos de cancelamento de inscrição.

Eu certamente não quero bloquear mais progresso agora que temos consenso.

(quanto à aparência, na minha opinião, parece bastante confuso, mas alguns usuários gostam)

1 curtida

Por Sam Saffron via Discourse Meta em 02 de agosto de 2022 05:29:

[quote=“Cameron Simpson, post:51, topic:233499,
username:cameron-simpson”]
Você pode elaborar um pouco sobre isso? Como é o e-mail neste
caso? Tem um exemplo?
[/quote]

Kane está falando sobre esta opção:

Os usuários podem optar por receber respostas anteriores com grande fidelidade
anexadas ao final dos e-mails.

Ah, obrigado.

Fico feliz em considerar isso como radiação de fundo por enquanto e tratá-lo de forma semelhante a como tratamos os links exclusivos de cancelamento de inscrição.

Essa também seria minha inclinação. Para mim, isso se encaixa com o objetivo de “a intenção original do postador/autor” do RFC. Bagagem acompanhante, mas não uma mensagem central diferente.

Abraços,
Cameron Simpson cs@cskk.id.au

2 curtidas

Concordo, vamos prosseguir como planejado. Comecei a analisar as mudanças ontem, começando com nosso receptor de e-mail.

@cameron-simpson apenas para sua informação, estou integrando isso a outras responsabilidades que tenho atualmente. Estarei de férias na próxima semana e novamente nas primeiras duas semanas de setembro, então pode levar um tempo para mostrar um progresso real aqui. Por favor, tenha certeza de que estou mantendo isso em mente e escreverei atualizações regulares aqui, muito obrigado por sua participação e contribuições até agora!

1 curtida

Por Martin Brennan via Discourse Meta em 02Aug2022 07:06:

@cameron-simpson apenas como informação, estou tecendo isso com outras
responsabilidades que tenho atualmente. Estarei de férias na próxima semana
e depois novamente nas primeiras duas semanas de setembro, então pode levar
um pouco de tempo para mostrar progresso real aqui. Por favor, tenha certeza de que estou
mantendo isso em mente e farei questão de escrever atualizações regulares
aqui, muito obrigado por sua participação e contribuições até agora!

Obrigado,
Cameron Simpson cs@cskk.id.au

@cameron-simpson Retornei ao trabalho nisso após minha viagem e queria obter mais esclarecimentos sobre diferentes cenários de References e In-Reply-To.

Cenário 1: Ao criar uma postagem no Discourse que não responde diretamente a outra postagem, simplesmente usamos o Message-ID do OP do tópico, que armazenamos na nova coluna outbound_message_id para References e In-Reply-To?

Cenário 2: Quando uma postagem responde a várias outras postagens ao mesmo tempo (o que pode acontecer por meio de citações), qual postagem usamos para In-Reply-To? E usamos todas elas para References ou apenas a única escolhida para In-Reply-To? Incluímos o Message-ID da postagem do OP em References?

Cenário 3: Semelhante ao acima, mas vamos nos ater a uma única postagem à qual estamos respondendo. Se estamos respondendo à postagem B, que por sua vez é uma resposta à postagem A, o In-Reply-To aponta simplesmente para a postagem B e, em seguida, as referências devem estar na ordem postagem A, postagem B (é claro, sempre se referindo a Message-IDs por meio de outbound_message_id na postagem)? Continuamos subindo na cadeia de respostas ou paramos no primeiro pai para References?

Isso se resume principalmente a como estamos interpretando esta citação do RFC, e afeta principalmente References - eles são limitados apenas a respostas diretas por citação ou de outra forma, ou eles também incluem sempre o OP.

Nota: Algumas implementações analisam o campo “References:” para exibir o “fio da discussão”. Essas implementações assumem que cada nova mensagem é uma resposta a um único pai e, portanto, que elas podem percorrer para trás o campo “References:” para encontrar o pai de cada mensagem listada lá. Portanto, tentar formar um campo “References:” para uma resposta que tem vários pais não é recomendado; como fazê-lo não é definido neste documento.

Obrigado Cameron, farei o que acho que está correto no meantime e ajustarei com base na sua resposta.

Por Martin Brennan via Discourse Meta em 19/08/2022 03:48:

@cameron-simpson Retomei o trabalho nisso depois de voltar
da minha viagem e queria obter mais alguns esclarecimentos sobre
diferentes cenários de References e In-Reply-To.

Cenário 1: Ao criar uma postagem no Discourse que não responde diretamente a outra postagem, usamos simplesmente o Message-ID do OP (Post Original) do tópico, que armazenamos na nova coluna outbound_message_id para References e In-Reply-To?

Talvez eu esteja com problemas de terminologia. Para o OP de um novo tópico, eu esperaria
nenhum References ou In-Reply-To, por ser o OP.

Para uma postagem em um tópico existente que não cita uma postagem anterior específica,
que acho que é o que você está descrevendo, apenas o Message-ID do OP
em cada um de References e In-Reply-To, exatamente como você
descreve.

Cenário 2: Quando uma postagem responde a várias outras postagens ao mesmo tempo (o que pode acontecer através de citações), qual postagem usamos para In-Reply-To?

[Relendo o RFC 5322 novamente…]

  • In-Reply-To deve conter os Message-IDs de cada uma das postagens para
    as quais responde.
  • References deve ser o References do pai(*) com o Message-ID do pai
    anexado.

Portanto, o In-Reply-To volta apenas uma mensagem na thread. Múltiplos
posts pais significam múltiplos message-ids, mas eles devem ser apenas os
message-ids dos posts pais imediatos.

O References destina-se a rastrear toda a cadeia de respostas do
OP até o pai(*) desta postagem. Portanto, é calculado como a thread para o
pai, mais o message-id do pai.

(*) Quando há mais de um pai: O RFC diz que como os clientes
(leitores de e-mail) frequentemente esperam que o References rastreie um único thread
de respostas do OP para a postagem, o RFC explicitamente desencoraja
a fusão de todos os References dos pais. Em vez disso, você deve escolher apenas
um. Minha inclinação pessoal seria o primeiro post pai citado, mas
isso é claramente uma decisão de política: escolha o que você achar mais útil
talvez.

Cenário 3: Semelhante ao acima, mas vamos nos limitar a uma única
postagem à qual estamos respondendo. Se estamos respondendo à postagem B, que por sua vez
é uma resposta à postagem A, o In-Reply-To aponta simplesmente para a postagem B
e então as referências devem estar na ordem de postagem A, postagem B (de
curso sempre se referindo a Message-IDs via outbound_message_id na
postagem)? Continuamos subindo a cadeia de respostas ou paramos no
primeiro pai para References?

O In-Reply-To volta exatamente uma camada. Então, neste cenário, ele
contém apenas o Message-ID da postagem pai.

O References é uma cadeia do OP para esta mensagem.

Isso se resume principalmente a como estamos interpretando esta citação do RFC, e afeta principalmente References - eles são limitados apenas a respostas diretas via citação ou de outra forma, ou eles também sempre incluem o OP.

Eles devem sempre começar no OP. Se todas as postagens anteriores fizeram
isso, você pode simplesmente anexar o message-id do pai ao References
do pai e obter toda a cadeia gratuitamente.

Se você estiver lidando com uma mensagem “legada”, você pode voltar na
árvore. Ou você pode decidir fazer isso sempre. Ou você pode dizer
que as coisas estão bem daqui para frente, pegaremos o References do
pai se ele estiver lá. Depende do que você está decidindo armazenar em seu banco de dados, eu
acho.

Acho que, desde que você esteja visando que In-Reply-To seja a parentagem imediata
e References seja uma linha de volta ao OP, você estará bem.

Abraços,
Cameron Simpson cs@cskk.id.au

2 curtidas

Sim, é isso que eu estava descrevendo, obrigado por isso.

Obrigado, então, essencialmente, a resposta é apenas – escolher uma única postagem que foi citada para usar como pai (seja a primeira citada ou a postagem criada mais recentemente, apenas é importante escolher uma), usar isso para In-Reply-To, e usá-la e seus pais de volta ao OP para References.

Entendi, faz sentido.

Acho que isso esclarece tudo e suas respostas foram o que eu esperava, eu queria apenas verificar antes de começar os testes manuais. Obrigado pela rápida resposta :+1:

1 curtida

@cameron-simpson Acho que consegui fazer funcionar como descrito, configurei o mutt e as coisas parecem estar encadeadas corretamente (embora eu não tenha certeza por que a linha de assunto está omitida no encadeamento, e também não tenho certeza de como configurá-lo para ver minhas próprias respostas enviadas inline dentro do encadeamento):

E aqui está como o Thunderbird representa o mesmo encadeamento (na verdade, percebi que o Thunderbird também não mostra minhas respostas inline):

Aqui está como fica no Gmail:

Os cabeçalhos estão abaixo, os IDs das postagens começam em 91, então postagem 1 == ID da postagem 91.

Postagem/Email 1

(Sem Referências ou In-Reply-To, pois é o primeiro email)

From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+3706c086cd36c6e37550c24f4e25c9b8@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/91@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

Postagem/Email 2

From: Bizarro Martin via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+9ea955b74a04dc85f5504ad245636824@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/92@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/91@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

Postagem/Email 3

From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+410877b7f868b59945f3e3ea16570fc4@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/93@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/91@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>

Postagem/Email 4

Responde à Postagem 2 e à Postagem 3, mas usamos a Postagem 3 como pai para a cadeia de referências, pois precisamos escolher apenas uma.

Date: Mon, 22 Aug 2022 04:05:45 +0000
From: Bizarro Martin via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+0a63eba3765f58e709a2ca538ca2b926@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/94@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/93@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

Postagem/Email 5

Esta responde diretamente à Postagem 4, que por sua vez responde diretamente à Postagem 3.

Date: Mon, 22 Aug 2022 05:05:06 +0000
From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+d66f675a0ce64fcaa2ba6b91e3112b05@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/95@discoursehosted.martin-brennan.com>
In-Reply-To: <discourse/post/94@discoursehosted.martin-brennan.com>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
 <discourse/post/94@discoursehosted.martin-brennan.com>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for

Postagem/Email 6

Resposta a uma resposta que enviei por email, note que mantive o (estranho) Message-ID gerado pelo Thunderbird 12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org.

Date: Mon, 22 Aug 2022 05:16:31 +0000
From: Martin Brennan via The Email Threading Sandbox <notifications@cdckmartintesting.discoursemail.com>
Reply-To: The Email Threading Sandbox <incoming+fb424977c7bd0c8146bdd7302dc35933@cdckmartintesting.discoursemail.com>
To: imaptest2@discourse.org
Message-ID: <discourse/post/97@discoursehosted.martin-brennan.com>
In-Reply-To: <12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org>
References: <discourse/post/91@discoursehosted.martin-brennan.com>
 <discourse/post/93@discoursehosted.martin-brennan.com>
 <discourse/post/94@discoursehosted.martin-brennan.com>
 <discourse/post/95@discoursehosted.martin-brennan.com>
 <12d1ec8f-859c-2339-2c7d-9cb3310756a2@discourse.org>
Subject: [The Email Threading Sandbox] [Royal Court] Threading topic 1 for
 2022-08-22

Posso te enviar uma mensagem privada agora para te configurar com uma conta no meu site de testes, e podemos trocar emails/respostas para ver se isso corresponde ao que você espera?

6 curtidas

Por Martin Brennan via Discourse Meta em 22 de agosto de 2022, 05:36:

@cameron-simpson Acho que consegui fazer funcionar como descrito, tenho o
mutt configurado e as coisas parecem estar encadeadas corretamente (embora eu não
tenha certeza por que a linha de assunto é omitida no encadeamento, e também não
tenha certeza de como configurá-lo para ver minhas próprias respostas enviadas
em linha dentro do encadeamento):

Parece bom aos meus olhos.
O assunto é omitido nas respostas (a menos que mude), o que facilita ver onde o próximo encadeamento começa. Você pode recolher encadeamentos, se preferir.
Ver suas próprias respostas requer ter uma cópia da resposta nessa pasta. A configuração $record controla isso.

E aqui está como o Thunderbird representa o mesmo encadeamento (na verdade, percebi que o Thunderbird também não mostra minhas respostas em linha):

Também bom aos meus olhos.

Aqui está como se parece no Gmail:

Isso é… bastante não compacto :slight_smile:

Os cabeçalhos estão abaixo, os IDs das postagens começam em 91, então a postagem 1 == ID da postagem 91.
[…]

Todos esses cabeçalhos parecem corretos de acordo com suas descrições dos relacionamentos das mensagens.

Noto que o Discourse usa Reply-To com um ID distinto, presumivelmente para juntar respostas de e-mail com base no endereço de e-mail de destino. Claramente, isso funciona. Se o Discourse derivasse isso dos cabeçalhos In-Reply-To da resposta, você poderia usar um endereço mais estável :slight_smile:

Posso te enviar uma PM agora para te configurar com uma conta no meu
site de testes, e podemos trocar e-mails/respostas para ver se isso corresponde ao que você espera?

Certamente!

Abraços,
Cameron Simpson cs@cskk.id.au

2 curtidas

Isso é realmente usado para determinar se estamos enviando para uma Categoria ou um Tópico, e não é realmente usado tanto quanto os Message-IDs etc. para In-Reply-To e References.

Obrigado, enviarei o PM e um convite por e-mail do meu site.

Já tivemos bastante troca de informações e parece que está funcionando como esperado, aqui está um exemplo da thread no Thunderbird:

@cameron-simpson, você concorda que eu prossiga para incluir isso no core do Discourse agora? Obrigado novamente por testar.

1 curtida

Acho que quero revisar as Referências um pouco mais de perto - pensei ter visto algumas estranhezas em uma mensagem, e fiz uma resposta múltipla por e-mail e ela não pareceu ser reconhecida como tal? Tentarei dar uma olhada esta noite.

1 curtida

Ah sim, agora vejo a sua última postagem. O que você espera no Discourse ao responder a 2 posts? Não tenho certeza se damos suporte à análise de citações e à atribuição delas a vários posts como respostas de e-mails recebidos. Obrigado por dar uma olhada mais a fundo em References também. Se você tivesse sua própria instância do Discourse e quisesse testar isso ou estivesse apenas curioso sobre a lógica, o código está neste branch feature/the-phantom-email-thread, veja https://github.com/discourse/discourse/pull/17996. Ele ainda precisa de um pouco de limpeza também.

Editar: Encontrei o problema da resposta, respondendo no fórum de teste.

1 curtida

Por Martin Brennan via Discourse Meta em 23Aug2022 06:16:

Ah, sim, agora vejo sua última postagem. O que você espera
dentro do Discourse ao responder a 2 posts? Não tenho certeza se
damos suporte à análise de citações e à atribuição delas a várias postagens como
respostas de e-mails recebidos.

Eu não esperava isso. Eu esperava que o Discourse olhasse para os
IDs das mensagens In-Reply-To, associasse esses IDs a postagens onde eles correspondem e derivasse a “resposta múltipla” disso.

Dito isso, eu nem sei como fazer uma resposta múltipla na web (por e-mail
é bem fácil, pelo menos com o mutt). Nem sei como você representa
postagens pai no seu banco de dados. Certamente você não analisa o texto da mensagem em si?

Obrigado por dar uma olhada mais a fundo em References também. Se você tivesse sua
própria instância do Discourse e quisesse testar isso ou estivesse apenas curioso sobre
a lógica, o código está neste branch
feature/the-phantom-email-thread, veja
https://github.com/discourse/discourse/pull/17996. Ele ainda precisa de
um pouco de limpeza também.

Obrigado, darei uma olhada. Preciso sentar e desenhar um diagrama da nossa discussão de teste
e verificar os vários cabeçalhos contra ele; eu estava muito distraído hoje.

Abraços,
Cameron Simpson cs@cskk.id.au

Coloquei alguns comentários aqui, mas meu cérebro está desligando. Em particular, os comentários em add_identification_field_headers são provavelmente equivocados - este é o código de fallback/original para quando este novo modo experimental não está habilitado? Os comentários em add_experimental_identification_field_headers são mais relevantes.

1 curtida