De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Mensagens HTML de lojas com erro na especificação de conteúdo

Colaboração: Fernando M. Roxo da Motta

Data de Publicação: 17 de Junho de 2009

Eu fiz uma compra através do sítio das Loj*****nas, até aí (quase) nada de anormal, afinal hoje isto é bastante comum. O problema é que eles começaram, mui gentilmente, a me mandar mensagens HTML para que eu pudesse acompanhar o andamento da compra. Alguma novidade até aqui ? Não, claro que não, afinal isto já é muito comum.

Então se está tudo normal, para que esta dica ?

O problema é que eu uso o Mutt que é um leitor texto. Isto, um leitor de mensagens que espera que o texto seja... Texto. Ok, isto pode ser um pouco incomum hoje em dia. Não que seja impossível ler email formatado HTML no Mutt, basta colocar no arquivo '~/.muttrc' uma linha como :

  auto_view text/html

Além disso deve-se colocar uma linha como :

  text/html; lynx -force_html -dump %s ; copiousoutput; nametemplate=%s.html

No arquivo '~/.mailcap'. Daí por diante ao abrir uma mensagem HTML o Mutt faz toda a pajelança necessária e a converte para texto como esperado pelo Mutt. Simples, não ?

Bem, para quem está acostumado a leitores de emails via navegador WEB ou estes cheios de parafernálias que acham que enviar email em HTML (normalmente junto com uma cópia em texto puro, para aumentar o tráfego) isto pode parecer complicado. Se for este o seu caso não se preocupe, o conteúdo desta dica não é para você e não vai alterar em nada a sua vida. ;)

Aparentemente o problema está resolvido, certo ? Não, a informação acima está no manual do Mutt e em uma penca de outros documentos facilmente "Googláveis". Portanto até aqui nenhuma novidade.

Vamos lá, qual o problema? O problema é que a mensagem veio assim :

  Content-Type: text/plain; charset=ISO-8859-1
  Content-Transfer-Encoding: quoted-printable
  
  <html> <head> <title>Recebemos seu pedido</title> </head>  <body
  bgcolor='#FFFFF
  F' topmargin='0'> <table width='550' border='0' align='center'
  cellpadding='0' c
  ellspacing='1' bgcolor='#E9E6DF'>   <tr>     <td valign='top'
  bgcolor='#FFFFFF'>
  
  =============8< --- um monte de lixo HTML removido ---------
  
  .*******nas.com.br/email/gap.gif' width='50' height='1'> </td> </tr>
  </table></td>   </tr> </table> </body> </html> }

Conseguiram perceber o problema ? O cabeçalho da mensagem diz que o conteúdo é "text/plain" mas o conteúdo é "text/html". Já que o Mutt espera mensagens bem formatadas, mesmo quando em HTML, que sigam minimamente o padrão, ele não usa o filtro do "auto_view". Logo o que vemos é a bagunça de um texto formatado em HTML onde a mensagem real é cerca de 10% do conteúdo.

Garimpar o que eles estão querendo dizer o meio daquele HTML todo não é fácil. E seria muito mais fácil se eles tivessem feito certo. :(

Ok, tem meio de forçar a filtragem para texto como o Mutt espera ?

Curto e grosso: sim !

E é isto que eu pretendo passar aqui. ;)

Não é trivial, mas nem por isto é difícil. Ou como diriam os camelôs "não requer prática nem habilidade", mas precisa atenção.

Para fazer a "brincadeira" eu vou construir uma macro baseada na de [de]codificação Rot13 que utiliza uma macro que se altera.

São três linhas para o '~/.muttrc':

  #-------------------------------------------------------
  #
  #  Aguns sites (vide Loj*********nas) são mal escritos o suficiente para
  #  enviar email HTML especificando "Content-Type:
  #  text/plain"
  #  Esta macro força o pipe pelo Lynx para gerar o texto corretamente.
  #
  macro pager ,@lnxon "<enter-command> set display_filter=lynx\\ -display_charset=utf-8\\ --force-html\\ -dump\\ -stdin; macro pager \\el ,@lnxoff 'Liga/desliga filtro HTML'<Enter><exit><display-message><enter-command> set ?display_filter<Enter>"
  
  macro pager ,@lnxoff "<enter-command> unset display_filter; macro pager \\el ,@lnxon 'Liga/desliga filtro HTML'<Enter><exit><display-message><enter-command> set ?display_filter<Enter>"
  
  macro pager \el ,@lnxon 'Liga/desliga filtro HTML'
  #-------------------------------------------------------

Uma macro é definida pela especificação "macro" seguida pelo ambiente onde ela é ativa, no caso "pager", a sequencia de ativação, a definição da macro e um texto para o auxílio (?) do Mutt.

A terceira linha cria uma macro acionada (ou acionável) no "pager", que é o leitor do conteúdo da mensagem. A macro é acionada pela sequencia <esc>l e a sua definição é chamar uma outra macro ",@lnxon".

A primeira linha define a macro ",@lnxon". A ação desta macro está descrita entre as aspas ("). O que ela faz ? Vamos destrinchar e escrever como se fosse um script :

A primeira parte :

  <enter-command> set display_filter=lynx\\ -display_charset=utf-8\\ --force-html\\ -dump\\ -stdin

Define uma variável (display_filter) que especifica o comando a ser usado antes de apresentar a mensagem. O comando a ser usado é :

  lynx -display_charset=utf-8 --force-html -dump -stdin

Este vai ler o conteúdo na entrada padrão (stdin) como um texto HTML (force-html) e gerar o texto resultante na saída padrão (dump).

A segunda parte :

  macro pager \\el ,@lnxoff 'Liga/desliga filtro HTML'<Enter>

Redefine a macro <esc>l para que ao ser acionada execute a macro ,@lnxoff, descrita na segunda linha de definição acima.

A terceira parte :

<exit><display-message><enter-command> set ?display_filter<Enter>

Sai da fase de definições (<exit>) e manda mostrar a mensagem (<display-message>) usando um comando (<enter-command>) definido pela variável display_filter.

Uff! Realmente não é simples, mas não é difícil. Resumindo a ópera da definição da macro ,@lnxon :

  1. define o comando de filtro.
  2. redefine a macro <esc>l para passar a executa a ,@lnxoff.
  3. mostra a mensagem através passada pelo comando de filtro.

O que a macro ,@lnxoff faz ? Na verdade ela desfaz o que a ,@lnxon faz :

  1. torna indefinido o comando do filtro.
  2. redefine a macro <esc>l para passar a executar a ,@lnxon.
  3. mostra a mensagem sem filtro algum.

O interessante é que na ajuda do Mutt (use tecla ?), antes de acionar a macro, vemos :

  <Esc>l      M ,@lnxon              Liga/desliga filtro HTML

Assim que acionamos a macro aparece :

  <Esc>l      M ,@lnxoff             Liga/desliga filtro HTML

Claro que se acionarmos a macro ela fica mudando entre uma e outra definição.

A mensagem filtrada fica :

  [pedido_header.gif]
  
  *** Esse é um e-mail automático. Não é necessário respondê-lo ***
  
  [gap.gif] [gap.gif]
  
  Fernando M R Motta, obrigado por escolher a *******nas.com!
  
  O seu pedido foi registrado em nosso sistema sob o número 99999999 e
  estamos aguardando a autorização da administradora do seu cartão de
  
  ================8<----- grande parte eliminada ----------------
  
  Atenciosamente, Atendimento ao Consumidor - *******nas.com ????-4848 ou
  023 11 ????-4848 [5]www.*******nas.com.br
  [gap.gif]
  
  }

Referências

1. http://www.***nas.com.br/emailconfirmacao 2. https://carrinho.***nas.com.br/portal/meuCadastro.portal?_nfpb=true&Lo ginControllerPortlet_actionOverride=%2Fportlets%2ForderHistory%2FpedidoHistorico 3. http://www.***nas.com.br/cgi-bin/WebObjects/StaticPages.woa/wa/Atendim entoClienteAction/atendcliente 4. http://faleconosco.***nas.com.br/ 5. http://www.***nas.com.br/

=============8< - corpo do email filtrado ---------

Bem diferente, certo ?

<ATENÇÃO !> A macro define um filtro de exibição a ser aplicado a todas as mensagens ao serem mostradas. Se você esquecer de desligá-la, usando o <esc>l, e a próxima mensagem aparecer embaralhada não se apoquente. Basta desligar o filtro e seguir a vida sem problema. </ATENÇÃO !>

Espero que isto ajude que novas macros interessantes apareçam por aqui.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Fernando M. Roxo da Motta