Homenageando Resent-* no destinatário do e-mail

Temos um fluxo de trabalho onde usamos o Discourse como um arquivo de e-mail. Temos um endereço de e-mail de grupo, e nossos agentes copiam esse endereço ao iniciar um tópico de e-mail com um cliente.

Isso funciona bem até que um cliente responda especificamente ao agente, ignorando todos os cabeçalhos Cc e até mesmo Reply-To. O agente então deve encaminhar o e-mail (reenviar) para o endereço de e-mail do grupo. O encaminhamento é o método preferido aqui, para que o Discourse arquive o e-mail original, incluindo todos os cabeçalhos originais, timestamps, etc.

Encaminhar um e-mail é feito copiando a mensagem exata e adicionando os cabeçalhos Resent-From e Resent-To. Estes são infelizmente ignorados pelo Email::Receiver. Ele deveria simplesmente anexar todos os Resent-* aos campos regulares respectivos.

Comecei a implementar isso e cheguei a fazer o create_incoming_email levar os campos em consideração. Eu então pude ver os e-mails, incluindo destinatários retirados do Resent-To, na lista de e-mails recebidos no Discourse.

No entanto, o que não consigo é fazer o get_all_recipients também honrar os campos Resent-*. Adicionei resent-to resent-cc resent-bcc ao array %i() dos campos de e-mail, mas ainda assim não parece retornar os destinatários desses campos.

Qualquer ajuda é bem-vinda, para que eu possa fazer um PR para essa mudança!

Isso parece uma funcionalidade bastante perigosa e propensa a impersonificação. Como você propõe que o remetente seja autenticado?


Além disso, o Discourse já possui processamento para e-mails encaminhados.

Isso parece uma funcionalidade bastante perigosa e propensa a falsificação de identidade. Como você propõe que o reenviador seja autenticado?

Com o cabeçalho Resent-From. Mas isso, na verdade, não importa; a parte interessante é se o remetente original pode ser autenticado, não o reenviador.

Além disso, o Discourse já tem processamento existente para e-mails encaminhados.

Apenas para encaminhamentos citados. Isso tem vários problemas:

  • Ele não arquiva o e-mail original, apenas uma cópia citada de seu corpo
  • Não há suporte para mensagens encaminhadas como anexo (com cabeçalhos completos)
  • É incompleto (depende de um prefixo especial no Assunto para reconhecer um e-mail encaminhado)

E como exatamente isso acontece? E se o reencaminhador simplesmente mentir e fabricar completamente um e-mail que supostamente foi enviado apenas para ele?

E como exatamente isso acontece? E se o remetente simplesmente mentir e fabricar completamente um e-mail que supostamente foi enviado apenas para ele?

Então eles poderiam muito bem omitir todo o conteúdo Resent- e simplesmente falsificar a coisa em primeiro lugar, sem alegar que foi enviada primeiro para eles.

Eu acho que você tem uma imaginação errada do que os cabeçalhos Resent- fazem - que, na verdade, não fazem absolutamente nada. Eles também não são levados em consideração quando os servidores de e-mail verificam SPF ou DKIM, então falsificar um e-mail reenviado é tão difícil quanto falsificar o e-mail original.

No meu caso, um e-mail reenviado de um estranho externo seria bloqueado pelo filtro de spam por violação de SPF. A razão pela qual meu cenário com agentes reenviando e-mails para o Discourse funciona é que eles são isentos dessas verificações após se autenticarem em nosso servidor de e-mail.

Permitir que o Discourse use o cabeçalho Resent-To é, portanto, nada mais do que um recurso de conveniência, porque é assim que os clientes de e-mail regulares criam uma cópia falsificada de um e-mail que receberam anteriormente. Isso não muda nada sobre a autenticação.

1 curtida