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

Existem algumas maneiras diferentes de vincularmos aos posts pais, e a associação é armazenada através da tabela PostReply, com reply_post_id representando o post que está fazendo a resposta e post_id referenciando o pai. E-mails recebidos usam In-Reply-To para vincular isso, e da interface do Discourse, se você cita vários posts, vários registros PostReply são criados, e se você usa o botão “Responder” em um único post, ele é usado para criar um registro PostReply.

Sim, desculpe, eu deveria ter notado isso, add_identification_field_headers não será mais usado, está tudo em add_experimental_identification_field_headers, o novo código. Obrigado por fazer comentários sobre o próprio código, eu não esperava isso! Vou trabalhar neles hoje.

@cameron-simpson, minhas desculpas, acho que você pode ter revisado um commit anterior nesse PR. Eu rebasei o código para ele e fiz o push novamente para ter um único commit com todo o código mais recente que temos testado naquele site de teste. Espero que a mensagem do commit seja útil e lógica.

Para References, se o usuário estiver respondendo a uma postagem, eu uso toda a cadeia de Message-IDs, do OP até a postagem pai, em ordem. Por exemplo, se todas essas postagens forem uma cadeia direta de respostas:

  • Post 1 – discourse/post/500@test.site
  • Post 2 – discourse/post/501@test.site
  • Post 3 – discourse/post/502@test.site
  • Post 4 – discourse/post/503@test.site
  • Post 5 – discourse/post/504@test.site

Então, o cabeçalho In-Reply-To para a última postagem será:

  • In-Reply-To: <discourse/post/503@test.site>

E References será:

  • References: <discourse/post/500@test.site> <discourse/post/501@test.site> <discourse/post/502@test.site> <discourse/post/503@test.site>

Se uma nova postagem for criada que não responde diretamente à postagem acima, por exemplo, Post 6 – discourse/post/505@test.site, então seu Message-ID In-Reply-To será <discourse/post/500@test.site> (o OP), e References será <discourse/post/500@test.site>, que também é o OP.

Por favor, me avise se isso estiver incorreto e eu posso revisar.

3 curtidas

Por Martin Brennan via Discourse Meta em 23 de agosto de 2022 23:59:

@cameron-simpson minhas desculpas, acho que você pode ter revisado um commit anterior naquela PR. Eu rebasei o código para ela e enviei novamente para ter um único commit com todo o código mais recente que temos testado naquele site de teste. Espero que a mensagem do commit seja útil e lógica.

Vou dar outra olhada, obrigado.

Para References, se o usuário estiver respondendo a uma postagem, eu uso toda a cadeia de Message-IDs do OP até a postagem pai em ordem. Por exemplo, se todas essas postagens forem uma cadeia direta de respostas:

  • Post 1 – discourse/post/500@test.site
  • Post 2 – discourse/post/501@test.site
  • Post 3 – discourse/post/502@test.site
  • Post 4 – discourse/post/503@test.site
  • Post 5 – discourse/post/504@test.site

Parece correto.

Então, o cabeçalho In-Reply-To para a última postagem será:

  • In-Reply-To: <discourse/post/503@test.site>
    E References será
  • References: <discourse/post/500@test.site> <discourse/post/501@test.site> <discourse/post/502@test.site> <discourse/post/503@test.site>

Também correto.

Se uma nova postagem for criada que não responde diretamente à postagem acima, por exemplo, Post 6 – discourse/post/505@test.site, então seu Message-ID In-Reply-To será <discourse/post/500@test.site> (o OP), e References será <discourse/post/500@test.site> que é o OP também.

Tudo isso está correto.

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

1 curtida

Obrigado. Eu também esqueci de mencionar que realmente precisamos ir ao banco de dados para recriar a cadeia References com base nos registros PostReply, você verá isso no último commit.

@cameron-simpson Gostaria de iniciar o processo de revisão interna com este código na próxima semana (além de um polimento geral do que fiz), já que estarei de férias no dia 3. Dessa forma, se a revisão for concluída, posso mesclá-lo e implantá-lo assim que voltar. Se você tiver algum feedback adicional, por favor, me avise antes disso, caso contrário, assumirei que está tudo bem (o que pareceu estar durante nossos testes ontem :slight_smile: ).

1 curtida

Acho que as coisas estão boas. Minhas anotações da varredura manual do tópico de e-mail no meu lado, que eu varri manualmente para cabeçalhos:

Tópico para teste de encadeamento 2022-08-23

post   msg-id  detail
59/1   98 OP novos tópicos para teste de encadeamento de e-mail
59/11 109 reply-to-topic in-reply-to 98 ref 98
59/2  100 reply-to-topic in-reply-to 98 ref 98
59/3  via-email uuid@discourse sim bem-vindo in-reply-to 100 ref 98,100
        não notado como uma resposta na interface web
???   me-via-email ...kr@cskk feliz em estar aqui in-reply-to uuid@discourse sem refs
        não notado como uma resposta na interface web
59/10 108 responder ao post anterior in-reply-to ...kr@cskk ref 98,100,0aa@discourse,kr@cskk
59/5  103 obrigado cameron in-reply-to kr@cskk refs 98,100,0aa@discourse,kr@cskk
???104   me-via-email ...zp@cskk in-reply-to 103 sem refs
        não notado como uma resposta na interface web
59/7 105 sem problema in-reply-to zp@cskk refs 98,100,00a@discourse,kr@cskk,103,zp@cskk
        postado na web, responder a 104? aka zp@@cskk
        não notado como uma resposta na interface web (então, novo-tópico?)
        cita kr@cskk "feliz em estar aqui"
        PRECISA DE REVISÃO
59/9 107 esperado ou um bug in-reply-to 106 ref 98,100,0aa@discourse,kr@cskk,103,zp@cskk,105,106
        cita 59/8

Notas:
- respostas de e-mail não são mostradas como respostas na interface web
- multi-respostas da web recebem apenas um msg-id no in-reply-to
- usuários não recebem cópias de e-mail de seus próprios posts (e-mail ou web), seria bom ter uma opção nas preferências para isso
- msg-ids da web parecem ser post.id do fórum, seria melhor se topic.id/in-topic.id para rastreamento mais fácil nos cabeçalhos

Em resumo: Não encontrei nenhum cabeçalho incorreto, mas notei algumas deficiências acima.

Ainda não tive a chance de revisar seu código atualizado, mas funcionalmente as coisas parecem corretas.

Obrigado,
Cameron

1 curtida

Obrigado, Cameron!

Você pode elaborar um pouco sobre isso? Você quer dizer que não consegue ver isso?

Ou que você não consegue ver esta parte? Para esta última, só mostramos a Resposta com a seta se a postagem para a qual você está respondendo estiver mais acima no tópico, não apenas a anterior:

Ah, eu não pensei que isso fosse necessário, então se você responder a N postagens pela web, todos os Message-IDs dessas postagens devem aparecer no cabeçalho In-Reply-To, e então References segue a lógica atual de um tópico do OP até um único pai (no nosso caso, eu escolho a postagem criada mais recentemente como o único pai)?

Sim, isso é por design para não enviar coisas que você já “viu”, poderíamos criar um TODO diferente para ver se há demanda por isso de mais usuários.

O problema com o ID do tópico é que ele é muito frágil e não é específico/único o suficiente, também parecerá um pouco confuso quando uma postagem for movida entre tópicos. Talvez possamos incluir um cabeçalho personalizado no e-mail, por exemplo, X-Discourse-Topic-ID ou algo assim (se for permitido) para permitir um rastreamento visual mais fácil?

2 curtidas

Não, eu vejo esse ícone.

Ah. Enquanto eu, como uma pessoa não familiarizada com fóruns por e-mail, esperava esse indicador em cada resposta porque não estou pensando nisso como um layout de mensagens instantâneas (talvez). Então minhas expectativas estão em desacordo com o que vocês escolheram fazer.

Não é necessário. Pense nisso como “qualidade de serviço”. Você explicitamente faz:

@message.header['In-Reply-To'] = referenced_post_message_ids[0] || topic_canonical_reference_id

e você poderia simplesmente remover o [0] daí. Os clientes poderiam então usar apenas um message-id ou fazer algo muito peculiar à vontade e tudo seria válido.

“Deveria” é uma palavra forte. Você poderia incluir todos os message-ids se eles estiverem facilmente à mão. Você não é obrigado, e o código é válido como está.

Sim. Eu sei que eu gosto disso para que eu saiba que minha postagem chegou à lista/fórum - o e-mail é muito baseado em filas e alguns (tosse, grande operadora australiana de telefonia, tosse) manipuladores de e-mail são muito… não confiáveis, lentos, etc. Ocasionalmente, vi outras pessoas querendo isso (em listas, mas esse é o modo sobre o qual estamos efetivamente falando aqui). O padrão para tal opção provavelmente deveria ser falso.

Como um nerd, eu gosto de poder obter pelo menos um feed não filtrado para que eu possa tomar minhas próprias decisões de política.

Dado que o Message-ID é efetivamente opaco/definido uma vez, não vejo isso como um problema, a menos que haja escopo para reemitir o mesmo message-id - se todos os seus contadores forem estritamente monotônicos, eu não esperaria que isso acontecesse. Eu apenas achei muito tedioso combinar post.id por exemplo 98 com tópico/post por exemplo 59/1. Teria sido útil ter algo como category.id/topic.id/post-in-topic.id ali em vez do 98.

Isso também seria suficiente. Isso é apenas conveniência nos cabeçalhos de depuração.

Abraços,
Cameron

4 curtidas

Esse ainda é o código antigo que você está olhando, você só precisa olhar para add_experimental_identification_field_headers. Mas seu ponto ainda se sustenta.

Há alguém em nossa equipe de infraestrutura que concordaria firmemente com essa declaração, eles compartilham um fluxo de trabalho e uma perspectiva semelhantes à sua :laughing:

Isso é justo, talvez eu reintroduza o ID do tópico também, já que outbound_message_id é de fato definido uma vez e não é alterado (com base se a postagem é gerada na interface web do Discourse ou por e-mail de entrada).

Provavelmente não precisarei disso agora, já que estou adicionando o ID do tópico ao Message-ID mais uma vez.

Ah, eu deveria ter visto isso, imagino:

 most_recent_post = referenced_posts.first
      most_recent_post_message_id = Email::MessageIdService.generate_or_use_existing(most_recent_post)
      @message.header["In-Reply-To"] = most_recent_post_message_id

Enfim, o que já existe já é válido. Totalmente a seu critério.

2 curtidas

Na verdade, não tenho certeza sobre isso, tenho um pressentimento de que não queremos realmente o ID do tópico nesses Message-IDs, apenas ter o ID da postagem o torna super simples. Tentarei isto em vez disso:

Na verdade, já os temos e os removemos aqui:

https://github.com/discourse/discourse/blob/d135d0613f44812566b739e77537225f9e7d5c90/lib/email/sender.rb#L179-L181

Podemos apenas mantê-los, não prejudica e ajuda na depuração visual!

Tudo bem para mim. Achei particularmente difícil vincular os cabeçalhos das mensagens de e-mail às postagens porque o post.id não é evidente na interface do usuário ou no URL da postagem específica na web. Ter isso presente em um cabeçalho de contexto adicional seria igualmente bom.

Obrigado,
Cameron

1 curtida

Apenas fazendo um rápido ping - o PR parece estar quieto há bastante tempo. - Cameron

Oi Cameron, estive no encontro da nossa empresa e depois de férias nas últimas 2 semanas, estou voltando à rotina hoje. Se não for mesclado esta semana, definitivamente será mesclado na próxima semana. Desculpas pelos atrasos!

Por Martin Brennan via Discourse Meta em 20 de setembro de 2022 00:17:

Olá Cameron, estive no encontro da nossa empresa e depois de férias por 2 semanas, estou voltando hoje. Se não for mesclado esta semana, definitivamente será mesclado na próxima semana. Desculpas pelos atrasos!

Não há necessidade de desculpas. Eu sabia que você tinha estado fora, não tinha certeza sobre o seu tempo ou retorno. E acho que ainda pode ser segunda-feira onde você está :slight_smile:

Obrigado,
Cameron Simpson cs@cskk.id.au

2 curtidas

Acabei de mesclar o PR, tentarei implantar o fórum Python ainda hoje para que você possa começar a usá-lo de verdade.

1 curtida

Por Martin Brennan via Discourse Meta em 25 de setembro de 2022 às 23:29:

Acabei de mesclar o PR, tentarei implantar o fórum Python mais tarde
hoje para que você possa começar a usá-lo de verdade.

Isso seria incrível. Obrigado, Cameron

2 curtidas

Isso foi feito agora, por favor, me avise aqui se você tiver algum problema :+1:

2 curtidas

Obrigado. Avisarei como ficou. Cameron