Um problema estranho surgiu em minha configuração de teste, onde estou copiando e-mails para o meu servidor Discourse e executando o import_mbox.sh para incorporar esses e-mails. Os e-mails originais são de uma lista de e-mails.
Descobri que, se as pessoas estiverem usando telefones Samsung e respondendo a um e-mail anterior da lista, se eu tentar importar esse e-mail resultante para o Discourse, ele não extrai o novo conteúdo, mas apenas exibe uma duplicata do e-mail original, mas rotulado como se a pessoa que respondeu o tivesse escrito.
Se eu copiar e colar o e-mail bruto que está causando problemas na caixa de Teste Avançado de E-mails, o mesmo problema está presente. Se eu truncar o e-mail e remover várias partes adicionadas pela Samsung, parece funcionar.
Não posso colocar cópias dos e-mails que desencadeiam isso aqui, pois são confidenciais. E-mails que não são importados têm seções como esta (e não há conteúdo legível por humanos - está tudo em codificação base64):
Então você precisará modificar import_mbox.sh para truncar o e-mail e remover o lixo da Samsung.
Poderia ser um problema que poderia ser resolvido no core, pois essas mensagens provavelmente falham quando processadas por e-mail (mas eu não olho o código ultimamente, então não sei). Em qualquer caso, a solução mais rápida provavelmente será modificar o script de importação para essas mensagens.
Ou talvez alguém reconheça isso como um problema no core e o corrija.
Após investigar um pouco mais, parece que o aplicativo de e-mail da Samsung codifica uma parte de texto simples e uma parte HTML, cada uma codificada em base64. Descobri que, se eu adicionar uma linha em branco entre as duas codificações, o filtro de e-mail funciona corretamente. Pode ser que a Samsung não esteja adicionando uma linha em branco onde deveria, ou pode ser que o filtro de e-mail não esteja localizando corretamente a parte de texto simples/HTML e não perceba que, uma vez encontrada a parte HTML, ele sabe onde o cabeçalho termina e o conteúdo da mensagem começa.
Tentei copiar o e-mail original do Gmail (via ver original) e também exportar a mesma mensagem do Thunderbird, com os mesmos resultados.
E-mails gerados pela Samsung parecem ter isto no final dos cabeçalhos:
Content-Type: multipart/alternative;
boundary="--_com.samsung.android.email_396413402758380"
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8
WWVz[a mensagem de texto simples codificada em base64 vai aqui]
e isso termina com
[mais dados codificados em base64 aqui]19fDQo=
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8
PGh0b[codificação base64 novamente, desta vez codificando a versão HTML da mesma mensagem]
e isso termina com
[mais dados codificados em base64]NCg==
----_com.samsung.android.email_396413402758380--
Agora, se eu alterar a parte do meio adicionando uma linha em branco (após a parte “email_396413402758380”), tudo funciona perfeitamente!
[mais dados codificados em base64 aqui]19fDQo=
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8
PGh0b[codificação base64 novamente, desta vez codificando a versão HTML da mesma mensagem]
Bem, nesse caso, eu diria que é um bug na gem mail que usamos para analisar e-mails ou um bug no aplicativo Samsung. Após uma rápida olhada nos RFCs, eu diria que provavelmente é um bug no analisador.
Você poderia, por acaso, fornecer um exemplo completo de um e-mail problemático como esse? Talvez você pudesse pedir a um dos autores de seus e-mails confidenciais para lhe enviar um e-mail não confidencial?
Tentei criar um e-mail decodificando o base64, alterando a redação e, em seguida, recodificando e encontrei algo mais interessante.
A remoção de um caractere de espaço no meio da mensagem original pode fazer com que a resposta escrita acima seja extraída corretamente.
Neste exemplo, no meio da mensagem HTML codificada em base64, se eu encontrar uma linha contendo um [espaço] antes de uma barra div e removê-la, então mude
21 20:17 (GMT+00:00) </div><div>To: LIST@LISTS
para
21 20:17 (GMT+00:00)</div><div>To: LIST@LISTS
através da remoção do caractere [espaço] antes da /div, em seguida, recodificar para base64 e colocá-lo de volta na caixa de teste de mensagem nas configurações de administrador, então o filtro funciona.
Posso postar um e-mail por mensagem direta se ajudar?
Aqui está um e-mail artificial que criei, o qual acredito demonstrar o problema. Se você olhar a parte HTML, ela contém uma resposta a uma mensagem anterior. O importador não parece conseguir ver onde a mensagem original começou.
Este problema parece afetar mensagens de outros clientes de e-mail também, estou descobrindo agora. Não posso postar publicamente os e-mails que geram as falhas para que todos analisem, mas ficaria feliz em deixá-los ver privadamente.
Minha configuração atual é que instalei o Discourse em um servidor doméstico, e-mails para uma lista de e-mails de mailing list são enviados para mim (que vai para uma conta do Gmail). Se um filtro ‘Para:’ corresponder ao nome da mailing list, configurei o Gmail para encaminhar uma cópia do e-mail para mailinglist@mydiscoursedomain.org.uk. O Discourse tem uma categoria configurada para espelhar uma mailing list que procura por este e-mail.
O mesmo problema ocorre se eu usar o script import_mbox.sh também, tendo copiado manualmente os e-mails, então deve ser a parte do código que procura a nova parte da mensagem que está confusa.
Existe alguma maneira de fazer o Discourse percorrer todos os e-mails importados armazenados anteriormente e tentar reformulá-los usando a parte de texto simples dos e-mails originais, caso isso seja uma solução temporária para o problema acima? Antes da importação, estava configurado para usar a parte HTML. Ao dar uma olhada usando ‘rails c’, posso ver que cada postagem parece ter o texto completo das mensagens recebidas armazenado (incluindo cabeçalhos de e-mail). Tentei executar o ‘rake posts:rebuild’ após desativar a opção HTML e, enquanto ele avança lentamente por todas as mensagens, não tenho certeza se algo mudou, por exemplo, tentei ativar e desativar a opção mostrar conteúdo recortado também, mas a caixinha com três pontos ainda parece estar lá nas postagens após o término do rake.