Ícone animado no assunto do e-mail

103

Eu sei sobre URIs de dados em que base64dados codificados podem ser usados ​​embutidos, como imagens. Hoje recebi um e-mail na verdade um spam, no qual havia um ícone animado (gif) no assunto:

insira a descrição da imagem aqui

Aqui está o ícone sozinho:

insira a descrição da imagem aqui

Então, a única coisa que passou pela minha cabeça foi tudo sobre URIs de dados e se o Gmail permite que algum tipo de emoticons seja inserido no assunto. Eu vi a versão completa e detalhada do e-mail e apontei para a linha de assunto na imagem abaixo:

insira a descrição da imagem aqui

Portanto, GIF vem de uma =?UTF-8?B?876Urg==?=string codificada que é semelhante ao esquema de URI de dados, no entanto, não consegui tirar o ícone dele. Aqui está a fonte HTML do elemento:

insira a descrição da imagem aqui

Para encurtar a história, existem muitos emoticons de https://mail.google.com/mail/e/XXXonde XXXvêm os números hexadecimais. Eles não estão documentados em lugar nenhum ou não consegui encontrá-los. Se é sobre URI de dados, como é possível incluí-los no assunto do e-mail do Gmail? (Eu encaminhei esse e-mail para uma conta de e-mail do yahoo, vendo em [?]vez do ícone) e se não for, como essa string codificada é analisada?

revo
fonte
25
A verdadeira questão é como você os bloqueia ?!
bambams
@bambams O que você quer dizer?
revo
13
Eles são extremamente irritantes e, como você disse, são usados ​​apenas por spammers. Prefiro que eles simplesmente não sejam mostrados pelo Gmail (ele já parece detectar 99% como spam).
bambams
1
aqui está como bloqueá-los
Jamesmstone
O link de jamesmstone mostra como bloquear as mensagens; se você deseja bloquear os próprios emojis e deixar as mensagens, use o script de usuário Emoji Roach Motel da linha de assunto do Gmail .
Louis Semprini

Respostas:

175

Pequena descrição:

Eles são chamados internamente de goomojie parecem ser uma extensão UTF-8 não padrão. Quando o Gmail encontra um desses caracteres, ele é substituído pelo ícone correspondente. Não consegui encontrar nenhuma documentação sobre eles, mas consegui fazer a engenharia reversa do formato.


O que são esses ícones?

Esses ícones são na verdade os ícones que aparecem no painel "Inserir emoticons".

Emoticons de inserção do Gmail

Embora eu não veja o 52Eícone na lista, existem vários outros que seguem a mesma convenção.

Observe que também existem alguns ícones cujos nomes são prefixados, como . Não fui capaz de determinar se ou como esses ícones podem ser usados ​​dessa maneira.gtalk.03C gtalk.03C


O que é essa coisa de URI de dados?

Na verdade, não é um URI de dados , embora compartilhe algumas semelhanças. Na verdade, é uma sintaxe especial para codificação de caracteres não ASCII em assuntos de e-mail, definidos no RFC 2047 . Basicamente, funciona assim.

=?charset?encoding?data?=

Portanto, em nossa string de exemplo, temos os seguintes dados.

=?UTF-8?B?876Urg==?=
  • charset = UTF-8
  • encoding= B(significa base64)
  • data = 876Urg==


Então, como isso funciona?

Sabemos que de alguma forma, 876Urg==significa o ícone 52E, mas como?

Se decodificarmos em base64 876Urg==, obtemos 0xf3be94ae. Isso se parece com o seguinte em binário:

11110011 10111110 10010100 10101110

Esses bits são consistentes com um caractere codificado em UTF-8 de 4 bytes.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Portanto, os bits relevantes são os seguintes:

     011   111110   010100   101110

Ou quando alinhado:

00001111 11100101 00101110

Em hexadecimal, esses bytes são os seguintes:

FE52E

Como você pode ver, exceto pelo FEprefixo que presumivelmente distingue os goomojiícones de outros caracteres UTF-8, ele corresponde ao 52Eno URL do ícone. Alguns testes comprovam que isso é verdadeiro para outros ícones.


Parece muito trabalhoso. Existe um conversor ?:

É claro que isso pode ser programado. Criei o seguinte código Python para meus testes. Essas funções podem converter a string codificada em base64 de e para a string hexadecimal curta encontrada na URL. Observe que este código foi escrito para Python 3 e não é compatível com Python 2.

Funções de conversão:

import base64

def goomoji_decode(code):
    #Base64 decode.
    binary = base64.b64decode(code)
    #UTF-8 decode.
    decoded = binary.decode('utf8')
    #Get the UTF-8 value.
    value = ord(decoded)
    #Hex encode, trim the 'FE' prefix, and uppercase.
    return format(value, 'x')[2:].upper()

def goomoji_encode(code):
    #Add the 'FE' prefix and decode.
    value = int('FE' + code, 16)
    #Convert to UTF-8 character.
    encoded = chr(value)
    #Encode UTF-8 to binary.
    binary = bytearray(encoded, 'utf8')
    #Base64 encode return end return a UTF-8 string. 
    return base64.b64encode(binary).decode('utf-8')

Exemplos:

print(goomoji_decode('876Urg=='))
print(goomoji_encode('52E'))

Resultado:

52E
876Urg==

E, é claro, encontrar o URL de um ícone simplesmente requer a criação de um novo rascunho no Gmail, inserindo o ícone que você deseja e usando o inspetor DOM do seu navegador.

Inspetor DOM

Alexander O'Mara
fonte
14
Essa é uma resposta completa incrível. Não tenho nada a dizer, mas só me pergunto como você fez uma engenharia reversa nisso !! Obrigado Alexander.
revo
2
A afirmação de que Bna sintaxe especial implica Base64 pode ter sido uma suposição (a string no final parece uma string codificada em Base64, se você já viu isso antes); depois disso, não é tão difícil perceber que os quatro bytes seguem um dos padrões UTF-8 para caracteres Unicode, especialmente porque ele está procurando por Unicode. É um trabalho de detetive muito legal, mesmo assim :)
sameers
3
@sameers Não há necessidade de adivinhar B- é definido em # 4
Seria bom citar a RFC na resposta acima, como referência.
Sameers
@JeremyMiller Obrigado por rastrear o RFC relevante! Não fui capaz de localizá-lo quando estava escrevendo esta resposta.
Alexander O'Mara
19

Se você usar o ponto de código hexadecimal correto (por exemplo, fe4f4 para 'pilha de cocô' ) e se estiver codificado corretamente no cabeçalho da linha de assunto, deixe-o ser base64 (consulte @AlexanderOMara) ou quoted-printable ( =?utf-8?Q?=F3=BE=93=B4?=), então o Gmail irá automaticamente analise e substitua-o pelo emoji correspondente.

Aqui está uma lista de emojis do Gmail para copiar e colar em linhas de assunto - ou corpos de e-mail. Emojis animados, que chamarão ainda mais atenção na caixa de entrada, são colocados em um fundo amarelo:

Emojis do Gmail em emailmarketingtipps.de

lukeA
fonte
0

Muito obrigado a Alexander O'Mara por uma resposta tão bem pesquisada sobre as imagens HTML marcadas com goomoji!

Eu só queria adicionar três coisas:

  • Ainda existem muitos emojis (e outras sequências Unicode que geram imagens) que os spammers e outros comerciantes de outrora estão começando a usar nas linhas de assunto do email e que o gmail não converte em imagens HTML. Em alguns navegadores, eles aparecem em negrito e coloridos, o que é quase tão ruim quanto a animação. Os navegadores também podem optar por animá-los, mas não sei se algum faz. Essas sequências Unicode são exibidas pelo navegador como texto Unicode, então a aparência exata (colorida ou não, animada ou não, ...) depende de qual sistema de renderização de texto o navegador está usando. A aparência de um determinado emoji Unicode também depende de quaisquer seletores de variação Unicode e modificadores de emojique aparecem próximos a ele na sequência de pontos de código Unicode. Ao contrário do spam de emoji baseado em imagem, essas sequências podem ser copiadas e coladas do navegador e em outros aplicativos como texto Unicode.

  • Espero que muitos profissionais de marketing que estão lendo esta pergunta sobre StackOverflow digam não. É uma ideia horrível incluir essas sequências nas linhas de assunto do seu e-mail e isso imediatamente manchará você e sua marca como spammers lowlife. Não vale a pena a "atenção" que seu e-mail receberá.

  • Claro que a primeira pergunta que vem à mente de todos é: "como faço para me livrar dessas coisas?" Felizmente, existe este script de usuário Greasemonkey / Tampermonkey / Violentmonkey de código aberto:

Linha de assunto do Gmail Emoji Roach Motel

Este script de usuário elimina tanto a imagem HTML (graças ao incrível trabalho de Alexander O'Mara ) quanto os tipos Unicode puro.

Para o último tipo, o script do usuário inclui uma expressão regular projetada para capturar as sequências Unicode que provavelmente serão abusadas pelos profissionais de marketing. O regex se parece com isso no ES6 Javascript (o script do usuário traduz isso para um regex pré-ES6 amplamente suportado usando o incrível ES6 Regex Transpiler ):

var re = /(\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F|[\u{2100}-\u{2BFF}\u{E000}-\u{F8FF}\u{1D000}-\u{1F5FF}\u{1F650}-\u{1FA6F}\u{F0000}-\u{FFFFF}\u{100000}-\u{10FFFF}])\s*/gu

// which includes the Unicode Emoji pattern from
//   https://github.com/tc39/proposal-regexp-unicode-property-escapes
// plus also these blocks frequently used for spammy emojis
// (see https://en.wikipedia.org/wiki/Unicode_block ):
//   U+2100..U+2BFF     Arrows, Dingbats, Box Drawing, ...
//   U+E000..U+F8FF     Private Use Area (gmail generates them for some emoji)
//   U+1D000..U+1F5FF   Musical Symbols, Playing Cards (sigh), Pictographs, ...
//   U+1F650..U+1FA6F   Ornamental Dingbats, Transport and Map symbols, ...
//   U+F0000..U+FFFFF   Supplementary Private Use Area-A
//   U+100000..U+10FFFF Supplementary Private Use Area-B
// plus any space AFTER the discovered emoji spam
Louis Semprini
fonte