Icono animado en el asunto del correo electrónico

103

Sé acerca de los URI de datos en los que base64se pueden usar datos codificados en línea, como imágenes. Hoy recibí un correo electrónico que en realidad era spam en el que había un ícono animado (gif) en su asunto:

ingrese la descripción de la imagen aquí

Aquí está el icono solo:

ingrese la descripción de la imagen aquí

Así que lo único que se me pasó por la cabeza fue todo sobre URI de datos y si Gmail permite que se inserte algún tipo de emoticonos en el asunto. Vi la versión detallada completa del correo electrónico y señalé la línea de asunto en la imagen de abajo:

ingrese la descripción de la imagen aquí

Entonces, GIF proviene de =?UTF-8?B?876Urg==?=una cadena codificada que es similar al esquema de URI de datos, sin embargo, no pude sacar el ícono. Aquí está la fuente HTML del elemento:

ingrese la descripción de la imagen aquí

En pocas palabras, hay muchos emoticonos de los https://mail.google.com/mail/e/XXXque XXXson números hexadecimales. No están documentados en ninguna parte o no pude encontrarlos. Si se trata de URI de datos, ¿cómo es posible incluirlos en el asunto del correo electrónico de Gmail? (Reenvié ese correo electrónico a una cuenta de correo electrónico de yahoo, viendo en [?]lugar del icono) y si no es así, ¿cómo se analiza esa cadena codificada?

revo
fuente
25
La verdadera pregunta es ¿cómo los bloqueas?
bambams
@bambams ¿A qué te refieres?
revo
13
Son increíblemente molestos y, como dijiste, solo los utilizan los spammers. Preferiría que Gmail no los muestre (ya parece detectar el 99% como spam).
bambams
1
aquí es cómo bloquearlos
jamesmstone
el enlace de jamesmstone muestra cómo bloquear los mensajes; Si desea bloquear los emoji y dejar los mensajes, use el script de usuario de Gmail Subject Line Emoji Roach Motel .
Louis Semprini

Respuestas:

175

Breve descripción:

Se les conoce internamente como goomoji, y parecen ser una extensión UTF-8 no estándar. Cuando Gmail encuentra uno de estos caracteres, se reemplaza por el icono correspondiente. No pude encontrar ninguna documentación sobre ellos, pero pude realizar ingeniería inversa en el formato.


¿Qué son estos iconos?

Esos iconos son en realidad los que aparecen debajo del panel "Insertar emoticonos".

Emoticonos de inserción de Gmail

Si bien no veo el 52Eícono en la lista, hay varios otros que siguen la misma convención.

Tenga en cuenta que también hay algunos iconos cuyos nombres tienen prefijos, como . No pude determinar si estos íconos se pueden usar de esta manera ni cómo.gtalk.03C gtalk.03C


¿Qué es esto de URI de datos?

En realidad, no es un URI de datos , aunque comparte algunas similitudes. En realidad, es una sintaxis especial para codificar caracteres no ASCII en asuntos de correo electrónico, definida en RFC 2047 . Basicamente funciona de esta manera.

=?charset?encoding?data?=

Entonces, en nuestra cadena de ejemplo, tenemos los siguientes datos.

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


¿Entonces, cómo funciona?

Sabemos que de alguna manera, 876Urg==significa el ícono 52E, pero ¿cómo?

Si decodificamos en base64 876Urg==, obtenemos 0xf3be94ae. Esto se parece a lo siguiente en binario:

11110011 10111110 10010100 10101110

Estos bits son consistentes con un carácter codificado en UTF-8 de 4 bytes.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Entonces los bits relevantes son los siguientes:

     011   111110   010100   101110

O cuando está alineado:

00001111 11100101 00101110

En hexadecimal, estos bytes son los siguientes:

FE52E

Como puede ver, a excepción del FEprefijo que presumiblemente distingue los goomojiíconos de otros caracteres UTF-8, coincide con el 52Ede la URL del ícono. Algunas pruebas demuestran que esto es válido para otros iconos.


Parece mucho trabajo, ¿hay un convertidor ?:

Esto, por supuesto, se puede programar. Creé el siguiente código Python para mis pruebas. Estas funciones pueden convertir la cadena codificada en base64 hacia y desde la cadena hexadecimal corta que se encuentra en la URL. Tenga en cuenta que este código está escrito para Python 3 y no es compatible con Python 2.

Funciones de conversión:

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')

Ejemplos:

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

Salida:

52E
876Urg==

Y, por supuesto, encontrar la URL de un icono simplemente requiere crear un nuevo borrador en Gmail, insertar el icono que desea y usar el inspector DOM de su navegador.

Inspector DOM

Alexander O'Mara
fuente
14
Esa es una respuesta completa asombrosa. No tengo nada que decir, ¡pero me pregunto cómo hiciste una ingeniería inversa en eso! Gracias Alexander.
revo
2
La afirmación de que Ben la sintaxis especial implica Base64 podría haber sido una suposición (la cadena al final parece una cadena codificada en Base64, si las ha visto antes); después de lo cual no es tan difícil notar que los cuatro bytes siguen uno de los patrones UTF-8 para caracteres Unicode, especialmente porque está buscando Unicode. Es un trabajo de detective bastante bueno, de todos
modos
3
@sameers No hay necesidad de adivinar B- está definido en el n. ° 4
Sería bueno mencionar el RFC en la respuesta anterior, como referencia.
sameers
@JeremyMiller ¡Gracias por rastrear el RFC relevante! No pude localizarlo cuando estaba escribiendo esta respuesta.
Alexander O'Mara
19

Si usa el punto de código hexadecimal correcto (por ejemplo, fe4f4 para 'pila de caca' ) y si está codificado correctamente dentro del encabezado de la línea de asunto, déjelo en base64 (ver @AlexanderOMara) o entre comillas-imprimible ( =?utf-8?Q?=F3=BE=93=B4?=), entonces Gmail automáticamente analizar y reemplazarlo con el emoji correspondiente.

Aquí hay una lista de emoji de Gmail para copiar y pegar en líneas de asunto , o cuerpos de correo electrónico. Los emojis animados, que llamarán aún más la atención en la bandeja de entrada, se colocan sobre un fondo amarillo:

Emojis de Gmail en emailmarketingtipps.de

lukeA
fuente
0

¡Muchas gracias a Alexander O'Mara por una respuesta tan bien investigada sobre las imágenes HTML etiquetadas con goomoji!

Solo quería agregar tres cosas:

  • Todavía hay muchos emoji (y otras secuencias Unicode que generan imágenes) que los spammers y otros comerciantes antiguos están comenzando a usar en las líneas de asunto del correo electrónico y que Gmail no convierte a imágenes HTML. En algunos navegadores, estos se muestran en negrita y coloreados, lo que es casi tan malo como la animación. Los navegadores también podrían optar por animarlos, pero no sé si alguno lo hace. El navegador muestra estas secuencias Unicode como texto Unicode, por lo que la apariencia exacta (color o no, animada o no, ...) depende del sistema de representación de texto que utilice el navegador. La apariencia de un emoji Unicode dado también depende de los selectores de variación Unicode y modificadores de emojique aparecen cerca de él en la secuencia de puntos de código Unicode. A diferencia del spam de emojis basado en imágenes, estas secuencias se pueden copiar y pegar fuera del navegador y en otras aplicaciones como texto Unicode.

  • Espero que los muchos especialistas en marketing que lean esta pregunta de StackOverflow simplemente digan que no. Es una idea horrible incluir estas secuencias en las líneas de asunto de su correo electrónico e inmediatamente lo empañarán a usted y a su marca como spammers de poca monta. No vale la "atención" que recibirá su correo electrónico.

  • Por supuesto, la primera pregunta que viene a la mente de todos es: "¿cómo me deshago de estas cosas?" Afortunadamente, existe este script de usuario Greasemonkey / Tampermonkey / Violentmonkey de código abierto:

Asunto de Gmail Emoji Roach Motel

Este script de usuario elimina tanto la imagen HTML (gracias al increíble trabajo de Alexander O'Mara ) como los tipos Unicode puro.

Para el último tipo, el script de usuario incluye una expresión regular diseñada para capturar las secuencias Unicode que probablemente sean abusadas por los especialistas en marketing. La expresión regular se ve así en ES6 Javascript (el script de usuario traduce esto a una expresión regular anterior a ES6 ampliamente admitida utilizando el increíble 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
fuente