Acabamos de migrar nossa instância do Discourse auto-hospedada de um servidor para outro. Todas as configurações foram transferidas do sistema antigo para o novo, incluindo ‘responder por e-mail’ e ‘permitir novas postagens por e-mail’. Estamos usando a configuração discourse/mail-receiver para lidar com a parte de e-mail.
Tanto a funcionalidade de responder quanto a de novo e-mail funcionaram perfeitamente no sistema antigo, mas temos um problema no novo servidor: a opção de responder não funciona mais.
Como um usuário desconhecido, quando envio um e-mail para o endereço configurado para esse fim, consigo ver a mensagem chegando. Um novo usuário em estágio é criado. A mensagem é postada. Ótimo!
Como usuário da Equipe, posso responder a essa mensagem, e ela é entregue corretamente. Perfeito!
MAS ao tentar responder novamente a esse e-mail, o que deveria resultar em uma resposta no Discourse, falha. Quando a mensagem chega no mail-receiver, ele tenta entregá-la por meio da API, mas isso falha com os seguintes erros no log.
(Por motivos de privacidade, alterei os nomes de usuário e domínio)
Como disse, todo esse processo de ida e volta funcionou perfeitamente no antigo. O novo setup é exatamente o mesmo (local_discourse/app e local_discourse/mail-receiver) do antigo.
Alguém poderia me dizer por que a API handle_mail estaria retornando um erro 400 para um e-mail de resposta?
Seria possível tornar o log mais detalhado, para que eu possa investigar mais a fundo?
Estou me perguntando qual é a diferença entre o ‘novo e-mail’ e o ‘e-mail de resposta’. Eu diria que a única diferença relevante é o destinatário. Mas ambos passam pelo mesmo manipulador (mail-receiver) e são enviados para a mesma API: https://forum.acme.org/admin/email/handle_mail
O problema não está na parte MX. O e-mail chega ao receptor de e-mail, conforme mostram os logs, mas assim que ele envia o e-mail para a API, recebe um erro 400 (o que significa uma solicitação inválida).
Há, no entanto, uma diferença na configuração: coloquei um proxy reverso (nginx) na frente dele para obter a funcionalidade de ‘temporariamente offline’ e, possivelmente, hospedar outros sites no mesmo servidor. Ainda não entendo por que isso seria um problema, já que um novo tópico está sendo aceito sem qualquer dificuldade. Ainda assim, vou ver o que acontece se eu remover o proxy reverso da equação…
Atualização
Que pena! Movi a instalação do Discourse de trás do proxy reverso nginx (basicamente recriando app com as configurações corretas e desligando o nginx), mas isso não resolveu o problema de forma alguma!
Agora, estou realmente sem ideias. O que está acontecendo aqui?
Para resumir:
Nossa instalação anterior do Discourse (app e mail-receiver) conseguia aceitar novos tópicos e respostas
Após migrar para um novo servidor (tudo exatamente igual), novos tópicos ainda são aceitos, mas as respostas estão sendo rejeitadas com um erro 400 Bad Request.
Encontrei o problema que está causando essa situação.
Ao testar vários clientes de e-mail, descobri que o e-mail enviado pelo meu cliente de desktop (Thunderbird) resultava em ‘400 Bad Request’, mas ao usar o cliente web, a resposta era enviada com sucesso.
Após uma investigação mais aprofundada, constatei que o Thunderbird, de alguma forma, alternava para a codificação Western (Windows-1252) ao responder, enquanto o cliente web mantinha o UTF-8. Ao forçar o Thunderbird a usar UTF-8, o e-mail também foi entregue com sucesso.
Acho que o receptor de e-mails precisa realizar alguma verificação e limpeza de codificação, mas como não sou desenvolvedor Ruby, vou passar essa parte do código para os desenvolvedores