Icône animée dans l'objet de l'e-mail

103

Je connais les URI de données dans lesquels base64des données encodées peuvent être utilisées en ligne, telles que des images. Aujourd'hui, j'ai reçu un e-mail en fait un spam dans lequel il y avait une icône animée (gif) dans son sujet:

entrez la description de l'image ici

Voici l'icône seule:

entrez la description de l'image ici

Donc, la seule chose qui m'est venue à l'esprit était tout à propos des URI de données et si Gmail permet d'insérer une sorte d'émoticônes dans le sujet. J'ai vu la version complète et détaillée de l'e-mail et j'ai indiqué la ligne d'objet de l'image ci-dessous:

entrez la description de l'image ici

Donc, GIF provient d' =?UTF-8?B?876Urg==?=une chaîne codée similaire au schéma URI de données, mais je n'ai pas pu en extraire l'icône. Voici la source HTML de l'élément:

entrez la description de l'image ici

Pour faire court, il existe de nombreuses émoticônes d' https://mail.google.com/mail/e/XXXXXXproviennent des nombres hexadécimaux. Ils ne sont documentés nulle part ou je n'ai pas pu les trouver. S'il s'agit d'URI de données, comment est-il possible de les inclure dans l'objet de l'e-mail de Gmail? (J'ai transféré cet e-mail à un compte de messagerie Yahoo, voyant [?]au lieu de l'icône) et si ce n'est pas le cas, comment cette chaîne encodée est-elle analysée?

revo
la source
25
La vraie question est de savoir comment les bloquer?!
bambams
@bambams Que voulez-vous dire?
revo le
13
Ils sont incroyablement ennuyeux et comme vous l'avez dit, ils ne sont utilisés que par les spammeurs. Je préfère qu'ils ne soient tout simplement pas affichés par Gmail (il semble déjà détecter 99% comme spam).
bambams
1
voici comment les bloquer
jamesmstone
le lien de jamesmstone montre comment bloquer les messages; si vous souhaitez bloquer les emoji eux-mêmes et laisser les messages, utilisez le script utilisateur de la ligne d'objet de Gmail Emoji Roach Motel .
Louis Semprini

Réponses:

175

Brève description:

Ils sont appelés en interne goomojiet semblent être une extension UTF-8 non standard. Lorsque Gmail rencontre l'un de ces personnages, il est remplacé par l'icône correspondante. Je n'ai pas pu trouver de documentation sur eux, mais j'ai pu procéder à une rétro-ingénierie du format.


Quelles sont ces icônes?

Ces icônes sont en fait les icônes qui apparaissent sous le panneau "Insérer des émoticônes".

Gmail Insérer des émoticônes

Bien que je ne vois pas l' 52Eicône dans la liste, il y en a plusieurs autres qui suivent la même convention.

Notez qu'il existe également des icônes dont les noms sont préfixés, tels que . Je n'ai pas été en mesure de déterminer si ou comment ces icônes peuvent être utilisées de cette manière.gtalk.03C gtalk.03C


Quelle est cette chose URI de données?

Ce n'est pas réellement un URI de données , bien qu'il partage certaines similitudes. Il s'agit en fait d'une syntaxe spéciale pour l'encodage de caractères non ASCII dans les sujets de courrier électronique, définie dans la RFC 2047 . En gros, ça marche comme ça.

=?charset?encoding?data?=

Ainsi, dans notre exemple de chaîne, nous avons les données suivantes.

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


Alors, comment ça marche?

Nous savons que d'une manière ou d'une autre 876Urg==signifie l'icône 52E, mais comment?

Si nous décodons en base64 876Urg==, nous obtenons 0xf3be94ae. Cela ressemble à ce qui suit en binaire:

11110011 10111110 10010100 10101110

Ces bits sont cohérents avec un caractère codé UTF-8 de 4 octets.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Les bits pertinents sont donc les suivants:

     011   111110   010100   101110

Ou lorsqu'il est aligné:

00001111 11100101 00101110

En hexadécimal, ces octets sont les suivants:

FE52E

Comme vous pouvez le voir, à l'exception du FEpréfixe qui sert vraisemblablement à distinguer les goomojiicônes des autres caractères UTF-8, il correspond 52Eà l'URL de l'icône. Certains tests prouvent que cela est vrai pour d'autres icônes.


Cela semble beaucoup de travail, y a-t-il un convertisseur?:

Cela peut bien sûr être scénarisé. J'ai créé le code Python suivant pour mes tests. Ces fonctions peuvent convertir la chaîne encodée en base64 vers et à partir de la chaîne hexadécimale courte trouvée dans l'URL. Notez que ce code est écrit pour Python 3 et n'est pas compatible avec Python 2.

Fonctions de conversion:

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

Exemples:

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

Production:

52E
876Urg==

Et, bien sûr, pour trouver l'URL d'une icône, il suffit simplement de créer un nouveau brouillon dans Gmail, d'insérer l'icône de votre choix et d'utiliser l'inspecteur DOM de votre navigateur.

Inspecteur DOM

Alexander O'Mara
la source
14
C'est une réponse complète incroyable. Je n'ai rien à dire mais je me demande simplement comment avez-vous fait une rétro-ingénierie là-dessus !! Merci Alexandre.
revo
2
L'assertion que Bdans la syntaxe spéciale implique Base64 pourrait avoir été une supposition (la chaîne à la fin ressemble en quelque sorte à une chaîne encodée en Base64, si vous les avez déjà vues); après quoi il n'est pas si difficile de remarquer que les quatre octets suivent l'un des modèles UTF-8 pour les caractères Unicode, en particulier parce qu'il recherche Unicode. C'est un travail de détective plutôt cool, tout de même :)
Sameers
3
@sameers Pas besoin de deviner B- c'est défini dans # 4
Il serait bon de mentionner la RFC dans la réponse ci-dessus, comme référence.
sameers
@JeremyMiller Merci d'avoir retrouvé le RFC pertinent! Je n'ai pas pu le localiser lorsque j'écrivais cette réponse.
Alexander O'Mara
19

Si vous utilisez le bon point de code hexadécimal (par exemple, fe4f4 pour 'pile de caca' ) et s'il est correctement encodé dans l'en-tête de la ligne d'objet, laissez-le être base64 (voir @AlexanderOMara) ou quoted-printable ( =?utf-8?Q?=F3=BE=93=B4?=), alors Gmail sera automatiquement analysez-le et remplacez-le par l'emoji correspondant.

Voici une liste d'emojis Gmail à copier et à coller dans les lignes d'objet ou dans le corps des e-mails. Les émojis animés, qui attireront encore plus l'attention dans la boîte de réception, sont placés sur un fond jaune:

Emojis Gmail sur emailmarketingtipps.de

lukeA
la source
0

Un grand merci à Alexander O'Mara pour une réponse aussi bien documentée sur les images HTML marquées par goomoji!

Je voulais juste ajouter trois choses:

  • Il existe encore de nombreux emoji (et autres séquences Unicode générant des images) que les spammeurs et autres spécialistes du marketing commencent à utiliser dans les lignes d'objet des e-mails et que gmail ne convertit pas en images HTML. Dans certains navigateurs, ceux-ci apparaissent en gras et colorés, ce qui est presque aussi mauvais que l'animation. Les navigateurs pourraient également choisir de les animer, mais je ne sais pas si c'est le cas. Ces séquences Unicode sont affichées par le navigateur sous forme de texte Unicode, de sorte que l'apparence exacte (couleur ou non, animée ou non, ...) dépend du système de rendu de texte utilisé par le navigateur. L'apparence d'un emoji Unicode donné dépend également de tous les sélecteurs de variation Unicode et des modificateurs d'emoji.qui apparaissent à proximité dans la séquence de points de code Unicode. Contrairement au spam emoji basé sur des images, ces séquences peuvent être copiées et collées hors du navigateur et dans d'autres applications sous forme de texte Unicode.

  • J'espère que les nombreux spécialistes du marketing qui liront cette question StackOverflow diront simplement non. C'est une idée horrible d'inclure ces séquences dans les lignes d'objet de vos e-mails et cela vous ternira immédiatement, vous et votre marque, en tant que spammeurs lowlife. Cela ne vaut pas "l'attention" que votre e-mail recevra.

  • Bien sûr, la première question qui vient à l'esprit de tout le monde est: "Comment puis-je me débarrasser de ces choses?" Heureusement, il existe ce script utilisateur Greasemonkey / Tampermonkey / Violentmonkey open-source:

Objet Gmail Emoji Roach Motel

Ce usercript élimine à la fois les images HTML (grâce au travail impressionnant d' Alexander O'Mara ) et les types Unicode pur.

Pour ce dernier type, le usercript inclut une expression régulière conçue pour capturer les séquences Unicode susceptibles d'être abusées par les marketeurs. Le regex ressemble à ceci dans ES6 Javascript (le script utilisateur le traduit en regex pré-ES6 largement pris en charge à l'aide de l'incroyable 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
la source