Erros Inexplicáveis de Email::Receiver::InvalidPost

Tenho algumas listas de e-mail espelhadas em Mailing Lists - Tor Project Forum

Recentemente, notamos que algumas mensagens não estavam sendo espelhadas da lista de e-mail Mailman3 para o fórum.

Os logs de rejeição de e-mail mostram que esses e-mails encontraram um erro Email::Receiver::InvalidPost.

A mensagem de erro registrada é uma das duas:

Lamentamos, mas sua mensagem de e-mail para [“tor-relays@lists.torproject.org”] (com o título [tor-relays] medições de largura de banda de autoridade e latência) não funcionou.

Motivo:

Acesso negado

Se você puder corrigir o problema, tente novamente.

ou:

Lamentamos, mas sua mensagem de e-mail para [“tor-relays@lists.torproject.org”] (com o título [tor-relays] Re: pontes webtunnel para o distribuidor do Telegram) não funcionou.

Motivo:

Algo deu errado. Talvez este tópico tenha sido fechado ou excluído enquanto você o visualizava?

Se você puder corrigir o problema, tente novamente.

Não consigo encontrar nada de errado com essas mensagens ao examinar os cabeçalhos, embora em alguns casos, o corpo extraído registrado contenha apenas o rodapé da lista de e-mail, ou em outro caso, seja um monte de caracteres sem sentido como se houvesse uma falha na decodificação.

Tentei reproduzir esse problema usando uma lista de e-mail de teste e uma categoria de teste, mas não obtive sucesso. Qualquer ajuda para depurar isso seria apreciada.

“aceitar e-mail de contas anônimas” está habilitado nas configurações de cada categoria, e você poderia enviar o log de e-mail do Discourse (levemente ocultado, se possível)?

1 curtida

Sim, posso confirmar que essa configuração está habilitada.

e você poderia enviar o log de e-mail do Discourse (levemente editado, se possível)

Isso é algo que preciso extrair do contêiner ou do host? Também processamos e-mails através do contêiner mail-receiver. Ou você quer os logs que são expostos na Interface Web (por exemplo, /admin/email-logs/rejected)?

Veio do Exchange?

Às vezes, o Microsoft Exchange envia lixo se estiver mal configurado para pensar que está falando com… Não tenho certeza - outro servidor Exchange? Algo mais dentro de sua própria infraestrutura?

Você pode ver o e-mail bruto do console do Discourse com, por exemplo:

mid = 'message-id from the log'
puts IncomingEmail.find_by(message_id: mid).raw

Isso mostra o e-mail bruto que o Discourse recebeu. Por exemplo, este corpo de mensagem que acabei de extrair de nossa lista de rejeição de entrada é realmente lixo:

This is a multi-part message in MIME format.
--=====003_Dragon855807841081_=====
Content-Type: text/plain;
 charset=utf-8
Content-Transfer-Encoding: base64

7bgir+m+vzzIDCLE0mDmZrfIXvvmXjY=

--=====003_Dragon855807841081_=====
Content-Type: text/html;
 charset=utf-8
Content-Transfer-Encoding: base64

LP/0L4tqmfZizO0DCDDE10uOzMZqzSHDjq04SLPaBjibLVHz+V94m1M45NDN
55aM8SMIf9XY4EFjP9CCFz+ojfmJqmubaz+bjrzmubw+bjWTiGSuLg==

--=====003_Dragon855807841081_=====--

já que as partes não decodificam para texto válido.

2 curtidas

ambos seriam ótimos. Se você usar o PuTTy SSH, poderá extrair os logs do contêiner e poderá recortar a interface do usuário do Discourse. No entanto, você não pode pesquisar palavras na foto facilmente para ocultá-las😮‍💨

Consegui extrair dois e-mails com os cabeçalhos completos. Um MUA é o Apple Mail e o outro é o Claws Mail.

Ficarei feliz em encaminhá-los para o e-mail privado de alguém para depuração, para que evitemos colá-los em toda a Internet.

Acho que em ambos os casos é provável que o Discourse não esteja analisando o conteúdo do e-mail corretamente.

Para constar, este ainda é um problema. O Discourse descarta regularmente mensagens de listas de e-mail de vários remetentes com o erro Email::Receiver::InvalidPost, por motivos que não consigo descobrir.

Se você clicar no erro nos logs, ele mostra o motivo na razão de rejeição?

por exemplo:

Se você clicar no erro nos logs, ele mostra o motivo na razão de rejeição?

Essas mensagens vêm em dois sabores:

Lamentamos, mas sua mensagem de e-mail para [\"tor-relays@lists.torproject.org\"] (com o título [tor-relays] Re: abuse report from relays in family 7EAAC49A7840D33B62FA276429F3B03C92AA9327) não funcionou.

Motivo:

Algo deu errado. Talvez este tópico tenha sido fechado ou excluído enquanto você o estava visualizando?

Se você puder corrigir o problema, tente novamente.

Posso confirmar que nada disso (tópico fechado ou excluído) aconteceu nesses casos.

Outras vezes, o Motivo é simplesmente Acesso Negado.

Olá lavamind - desculpe ressuscitar um tópico antigo, mas eu queria verificar primeiro antes de aprofundarmos na depuração.

Você ainda está vendo as rejeições Email::Receiver::InvalidPost no espelhamento da lista de e-mail até agora (final de 2025 / início de 2026)?

Se sim, você poderia compartilhar um breve panorama de:

  • aproximadamente com que frequência isso acontece (por exemplo, diário / semanal, % das mensagens)
  • se a “Razão” do e-mail rejeitado ainda é principalmente “Acesso Negado” versus “tópico fechado/excluído”
  • se isso está afetando uma lista/categoria ou várias

Assim que confirmarmos que ainda está ocorrendo, poderemos prosseguir para coletar o conjunto mínimo de diagnósticos para uma única falha recente (Message-ID + o e-mail bruto armazenado correspondente, etc.).

Não precisa se desculpar, fico muito feliz que você esteja investigando isso.

Oi lavamind - desculpe por ressuscitar um tópico antigo, mas eu queria verificar antes de aprofundarmos mais na depuração.

Você ainda está vendo as rejeições Email::Receiver::InvalidPost na replicação da lista de e-mails no momento (final de 2025 / início de 2026)?

Sim, o problema ainda está ocorrendo.

aproximadamente com que frequência isso acontece (por exemplo, diariamente/semanalmente, % das mensagens)

A frequência é difícil de determinar exatamente, mas o problema afeta pelo menos várias mensagens por semana, uma estimativa aproximada talvez entre 5 a 10% das mensagens? Alguns remetentes parecem estar super-representados nos logs de erro, então pelo menos não parece totalmente aleatório.

se a “Razão” do e-mail rejeitado ainda é principalmente “Acesso Negado” versus “tópico fechado/excluído”

Ainda é uma mistura dos dois.

se está afetando uma lista/categoria ou várias

Está afetando principalmente a categoria tor-relays, mas esta lista recebe entrada regular de vários remetentes, ao contrário das outras listas que espelhamos, que recebem tráfego muito menor.

Assim que confirmarmos que ainda está ocorrendo, podemos prosseguir para coletar o conjunto mínimo de diagnósticos para uma falha recente (Message-ID + o e-mail bruto armazenado correspondente, etc.).

Poderíamos analisar este tópico recente. O arquivo do Mailman indica que recebeu 5 mensagens, mas o tópico espelhado do fórum tem apenas 3 postagens. Os logs de rejeição contêm 3 erros InvalidPost para este tópico (2 do mesmo remetente, estranhamente) e para todos eles a razão de rejeição mostrada é “Algo deu errado. Talvez este tópico tenha sido fechado ou excluído enquanto você olhava para ele?”

Obrigado, lavamind - esse é um dado muito útil, especialmente por termos um tópico concreto de “arquivo do Mailman mostra 5, tópico do fórum mostra 3” para nos ancorarmos.

Dado que você está vendo isso várias vezes por semana (cerca de 5-10% das mensagens) e que, para este incidente, o motivo da rejeição é consistentemente a variante enganosa de “tópico fechado/excluído”, o próximo passo ideal é capturar uma mensagem de ponta a ponta para vermos o que o Discourse pensou que estava fazendo.


Para um dos 3 e-mails rejeitados associados àquele tópico espelhado, você poderia obter o seguinte:

  1. Em /admin/email-logs/rejected, abra uma das linhas InvalidPost para aquele incidente e copie:

    • o Message-ID
    • a data/hora
    • o Para / De / Assunto (redigidos) mostrados na linha
    • o texto completo do motivo da rejeição (conforme exibido)
  2. No console do Rails (no contêiner do aplicativo Discourse), extraia o e-mail bruto que o Discourse armazenou:

@supermathie, IncomingEmail ainda é o local canônico para buscar o bruto, e há mais alguma coisa que você gostaria além dele para depurar o InvalidPost?

mid = "<cole aqui o Message-ID do log de e-mail rejeitado>"
ie  = IncomingEmail.find_by(message_id: mid)

puts ie&.raw
  1. Também extraia os atributos pareados do EmailLog para o mesmo Message-ID (isso geralmente revela se o Discourse o tratou como uma resposta ou um novo tópico, e quais IDs de tópico/categoria ele resolveu):
mid = "<o mesmo Message-ID acima>"

log = EmailLog.where(message_id: mid).order(created_at: :desc).first
pp log&.attributes&.slice(
  "id",
  "email_type",
  "to_address",
  "from_address",
  "subject",
  "post_id",
  "topic_id",
  "user_id",
  "status",
  "bounce_error_code",
  "bounce_key",
  "created_at"
)

Por que este trio?

  • IncomingEmail.raw nos diz se o e-mail chegou malformado / codificado de forma estranha / apenas com rodapé, em oposição ao Discourse ter escolhido a parte MIME “errada”.
  • EmailLog nos diz o que o Discourse tentou (chave de resposta vs. roteamento de tópico, IDs de tópico/categoria resolvidos, etc.).
  • A linha da interface do e-mail rejeitado confirma que estamos olhando para o mesmo incidente e preserva o que os operadores veem.

Se a privacidade for uma preocupação, sinta-se à vontade para redigir endereços e qualquer texto do corpo da mensagem dentro do bruto, mas, por favor, mantenha:

  • Cabeçalhos MIME (Content-Type, limites, charset, Content-Transfer-Encoding)
  • A estrutura multipart (para que possamos ver quais partes existem)
  • O Message-ID e cabeçalhos de roteamento básicos (você pode redigir domínios, se necessário)

Assim que tivermos um Message-ID falho + IncomingEmail.raw + a fatia do EmailLog, poderemos dizer rapidamente se isso é:

  • uma incompatibilidade de chave de resposta/roteamento de tópico,
  • um caso extremo de permissões,
  • ou uma falha na análise de e-mail / seleção de parte MIME / decodificação.