Анімований значок у темі електронної пошти


103

Я знаю про URI даних , в яких base64кодовані дані можуть використовуватися вбудованими, такими як зображення. Сьогодні я отримав електронний лист фактично спам, у якому в його темі була анімована (gif) піктограма:

введіть тут опис зображення

Ось лише одна ікона:

введіть тут опис зображення

Тож єдине, що мені спадало на думку, було все про URI даних, і якщо Gmail дозволяє вносити якісь смайлики в тему. Я побачив повну докладну версію електронної пошти та вказав на рядок теми на малюнку нижче:

введіть тут опис зображення

Таким чином, GIF походить з =?UTF-8?B?876Urg==?=кодованого рядка, який схожий на схему URI даних, однак я не зміг отримати значок з нього. Ось HTML-джерело елемента:

введіть тут опис зображення

Якщо коротко розповісти, є багато смайликів, https://mail.google.com/mail/e/XXXзвідки XXXшістнадцяткові числа. Вони ніде не задокументовані, або я не міг її знайти. Якщо мова йде про URI даних, то як можна включити їх до теми електронної пошти Gmail? (Я переслав цей електронний лист в обліковий запис електронної пошти Yahoo, бачачи [?]замість піктограми), а якщо це не так, то як цей кодований рядок розбирається?


25
Справжнє питання - як їх блокувати ?!
бамбуки

@bambams Що ти маєш на увазі?
revo

13
Вони неймовірно дратують, і, як ви сказали, їх використовують лише спамери. Я вважаю за краще, що вони просто не показали Gmail (він, здається, виявляє 99% як спам).
бамбук

1
ось як їх заблокувати
jamesmstone

посилання jamesmstone показує, як блокувати повідомлення; якщо ви хочете заблокувати смайли і залишити повідомлення, скористайтеся сценарієм користувальницької теми Gmail Emoji Roach Motel .
Луї Семпріні

Відповіді:


175

Короткий опис:

Вони називаються всередині як goomoji, і вони здаються нестандартним розширенням UTF-8. Якщо Gmail стикається з одним із цих символів, він замінюється відповідним значком. Я не зміг знайти жодної документації на них, але я зміг змінити формат.


Що це за ікони?

Ці піктограми - це фактично значки, які відображаються на панелі "Вставити смайлики".

Gmail Вставка смайликів

Поки я не бачу 52Eпіктограми у списку, є кілька інших, які дотримуються тієї ж конвенції.

Зверніть увагу , що є також деякі іконки, імена яких починаються, наприклад . Я не зміг визначити, чи можна використовувати ці значки таким чином.gtalk.03C gtalk.03C


Що це за URI даних?

Це насправді не URI даних , хоча він має деякі подібності. Насправді це спеціальний синтаксис для кодування символів, що не належать до ASCII, у темах електронної пошти, визначених у RFC 2047 . В основному, це працює так.

=?charset?encoding?data?=

Отже, у нашому прикладі рядка маємо такі дані.

=?UTF-8?B?876Urg==?=
  • charset = UTF-8
  • encoding= B(означає base64)
  • data = 876Urg==


Отже, як це працює?

Ми знаємо, що якось 876Urg==означає ікону 52E, але як?

Якщо ми базуємо64 декодування 876Urg==, отримуємо 0xf3be94ae. Це виглядає так:

11110011 10111110 10010100 10101110

Ці біти узгоджуються з 4-байтним кодованим символом UTF-8.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Отже, відповідні біти наступні:

     011   111110   010100   101110

Або при вирівнюванні:

00001111 11100101 00101110

У шістнадцятковому значенні ці байти:

FE52E

Як бачите, за винятком FEпрефікса, який імовірно відрізняє goomojiпіктограми від інших символів UTF-8, він відповідає 52EURL-адресі значка. Деякі тестування доводять, що це стосується інших значків.


Здається, багато роботи, чи є перетворювач ?:

Це, звичайно, можна прописати. Я створив наступний код Python для мого тестування. Ці функції можуть перетворити кодовану рядок base64 в короткий шістнадцятковий рядок, знайдений в URL-адресі. Зауважте, цей код написаний для Python 3, і не сумісний із Python 2.

Функції перетворення:

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

Приклади:

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

Вихід:

52E
876Urg==

І, звичайно, для пошуку URL-адреси піктограми просто потрібно створити нову чернетку в Gmail, вставити потрібний значок та за допомогою інспектора DOM вашого браузера.

Інспектор DOM


14
Це дивовижна повна відповідь. У мене немає нічого сказати, але мені просто цікаво, як ти зробив зворотну інженерію на цьому !! Дякую, Олександре.
revo

2
Твердження, що Bв спеціальному синтаксисі має на увазі Base64, можливо, було б здогадкою (рядок у кінці виглядає як кодований рядок Base64, якщо ви їх бачили раніше); після чого не так важко помітити, що чотири байти слідують за одним із шаблонів UTF-8 для символів Unicode, особливо тому, що він шукає Unicode. Це дуже крута детективна робота, все одно :)
sameers

3
@sameers Про це не потрібно здогадуватися B- це визначено в # 4

Було б добре згадати RFC у відповіді вище, як посилання.
sameers

@JeremyMiller Дякуємо за відстеження відповідних RFC! Я не зміг її знайти, коли писав цю відповідь.
Олександр О'Мара

19

Якщо ви використовуєте правильну шістнадцяткову кодову точку (наприклад, fe4f4 для "ворсинки пу" ) і якщо вона правильно зашифрована в заголовку рядка теми, нехай це буде base64 (див. @AlexanderOMara) або з цитатами для друку ( =?utf-8?Q?=F3=BE=93=B4?=), Gmail автоматично буде автоматично проаналізуйте та замініть його відповідними емоджими.

Ось список смайлів Gmail для копіювання та вставлення в рядки тематики - або органи електронної пошти. Анімовані емоджи, які привернуть ще більше уваги у папці "Вхідні", розміщуються на жовтому фоні:

Gmail емоджи на emailmarketingtipps.de


0

Велике спасибі Олександру О'Марі за таку добре вивчену відповідь про HTML-зображення, позначені goomoji!

Я просто хотів додати три речі:

  • Є ще багато багато емоджи (та інших послідовностей Unicode, що генерують зображення), які спамери та інші маркетологи, які раніше працювали, починають використовувати в тематичних рядках електронної пошти, і що Gmail не перетворює на зображення HTML. У деяких браузерах вони відображаються жирними та кольоровими, що майже так само погано, як і анімація. Браузери також можуть вибрати анімацію, але я не знаю, чи є. Ці послідовності Unicode відображаються браузером як текст Unicode, тому точний вигляд (кольоровий чи ні, анімований чи ні, ...) залежить від того, яку систему візуалізації тексту використовує браузер. Поява певних смайликів Unicode також залежить від будь-яких селекторів варіацій Unicode та модифікаторів смайликівякі з'являються біля нього в послідовності точок коду Unicode. На відміну від спаму емоджи на основі зображень, ці послідовності можна скопіювати та вставити з браузера та в інші додатки у вигляді тексту Unicode.

  • Я сподіваюся, що багато маркетологів, що читають це питання StackOverflow, просто скажуть "ні". Жахлива ідея включити ці послідовності у рядки теми електронної пошти, і це негайно заплямить вас і ваш бренд як спамерів із низьким рівнем життя. Не варто "уваги", яке отримає ваш електронний лист.

  • Звичайно, перше питання, що спадає на думку кожному, - це: "як я позбудусь цих речей?" На щастя, є цей сценарій користувача з відкритим кодом Greasemonkey / Tampermonkey / Violentmonkey:

Тема Gmail Emoji Roach Motel

Цей користувальницький сценарій виключає як HTML-зображення (завдяки чудовій роботі Олександра О'Мари ), так і чисто-Unicode типи.

Для останнього типу користувальницький сценарій включає регулярний вираз, призначений для захоплення послідовностей Unicode, які, можливо, зловживають маркетологи. Регекс виглядає так у Javascript ES6 (користувальницький сценарій переводить це на широко підтримуваний попередній ES6 регулярний вираз із використанням дивовижного 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.