Animowana ikona w temacie wiadomości e-mail

Wiem o Data URI s, w których base64 zakodowane dane mogą być używane w linii, takich jak obrazy. Dzisiaj otrzymałem e-mail faktycznie spamowy, w którym była animowana (gif) ikona w temacie:

Tutaj wpisz opis obrazka

Oto sama ikona:

Tutaj wpisz opis obrazka

Więc jedyne, co przyszło mi do głowy, to wszystko o Uri danych i czy Gmail pozwala na wstawianie emotikon w temacie. Zobaczyłem pełną, szczegółową wersję e-maila i wskazałem na temat na poniższym obrazku:

Tutaj wpisz opis obrazka

Więc GIF pochodzi z =?UTF-8?B?876Urg==?= zakodowanego ciągu, który jest podobny do schematu Data URI, jednak nie mogłem wyciągnąć z niego ikony. Oto element HTML source:

Tutaj wpisz opis obrazka

Krótko mówiąc, istnieje wiele Emotikon z https://mail.google.com/mail/e/XXX Gdzie {[3] } są liczbami szesnastkowymi. Nigdzie nie są udokumentowane lub nie mogłem ich znaleźć. Jeśli chodzi o dane URI, to w jaki sposób można je uwzględnić w temacie wiadomości e-mail Gmaila? (Przekazałem, że e-mail do konta Yahoo e-mail, widząc [?] zamiast ikony), a jeśli nie, to jak ten zakodowany ciąg jest przetwarzany?

Author: revo, 2015-01-22

3 answers

Krótki opis:

Są nazywane wewnętrznie goomoji i wydają się być niestandardowym rozszerzeniem UTF-8. Gdy Gmail napotka jedną z tych postaci, zostanie ona zastąpiona odpowiednią ikoną. Nie udało mi się znaleźć na nich żadnej dokumentacji, ale udało mi się odtworzyć format.


Co to za ikony?

Te ikony są w rzeczywistości ikonami, które pojawiają się pod "Wstaw emotikony" panel.

Emotikony Gmail Insert

While I don ' t see the 52E ikona na liście, istnieje kilka innych, które stosują tę samą konwencję.

Zauważ, że istnieją również ikony, których nazwy są poprzedzone prefiksem, takie jak gtalk.03C gtalk.03C. Nie byĹ ' em w stanie ustaliÄ ‡ czy i w jaki sposĂłb owe ikony mogÄ ... byÄ ‡ uĺľywane w ten sposĂłb.


Co to jest ten Uri danych coś?

To nie jest tak naprawdę Data URI , chociaż ma pewne podobieństwa. Jest to specjalna składnia do kodowania znaków innych niż ASCII w tematach wiadomości e-mail, zdefiniowana w RFC 2047. Zasadniczo działa to w ten sposób.

=?charset?encoding?data?=

Tak więc w naszym przykładzie mamy następujące dane.

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


Więc, jak to praca?

Wiemy, że w jakiś sposób, 876Urg== oznacza ikonę 52E, ale jak?

Jeśli Base64 dekoduje 876Urg==, otrzymujemy 0xf3be94ae. Wygląda to następująco w pliku binarnym:

11110011 10111110 10010100 10101110

Te bity są zgodne z 4-bajtowym kodem UTF-8.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Więc odpowiednie bity są następujące.:

     011   111110   010100   101110

Lub po wyrównaniu:

00001111 11100101 00101110

W systemie szesnastkowym te bajty są następujące:

FE52E

Jak widać, z wyjątkiem prefiksu FE, który prawdopodobnie odróżnia ikony goomoji od innych znaków UTF-8, pasuje do 52E w adresie URL ikon. Niektóre testy udowadniają, że dotyczy to innych ikon.


Brzmi jak dużo pracy, czy jest konwerter?:

To oczywiście może być skrypt. Na potrzeby moich testów stworzyłem następujący kod Pythona. Funkcje te mogą konwertować zakodowany łańcuch base64 na i z krótkiego ciągu szesnastkowego znalezionego w adresie URL. Uwaga, ten kod jest napisany dla Pythona 3 i nie jest kompatybilny z Pythonem 2.

Funkcje konwersji:

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

Przykłady:

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

Wyjście:

52E
876Urg==

I oczywiście znalezienie adresu URL ikony wymaga po prostu utworzenia nowego projektu w Gmailu, Wstawienia żądanej ikony i użycia Inspektora DOM w przeglądarce.

Inspektor DOM

 169
Author: Alexander O'Mara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-26 08:28:05

Jeśli użyjesz poprawnego punktu kodu szesnastkowego (np. fe4f4 dla 'stos kupy') i jeśli jest on poprawnie zakodowany w nagłówku tematu, niech będzie to base64 (patrz @AlexanderOMara) lub quoted-printable (=?utf-8?Q?=F3=BE=93=B4?=), to Gmail automatycznie przetworzy i zastąpi go odpowiednimi emoji.

Oto lista Emotikon Gmail do kopiowania i wklejania do wierszy tematu - lub ciał e-mail. Animowane emotikony, które przyciągną jeszcze więcej uwagi w skrzynce odbiorczej, są umieszczone na żółtym background:

Emotikony Gmail na emailmarketingtipps.de

 18
Author: lukeA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-20 23:58:18

Wielkie podziękowania dla Alexandra O ' Mara za tak dobrze zbadaną odpowiedź na temat obrazów HTML oznaczonych tagiem goomoji!

Chciałem tylko dodać trzy rzeczy:

  • Nadal istnieje wiele emoji (i innych sekwencji generujących obrazy Unicode), które spamerzy i inni dawni marketerzy zaczynają używać w tematach wiadomości e-mail i że gmail nie konwertuje na obrazy HTML. W niektórych przeglądarkach są one pogrubione i kolorowe, co jest prawie tak złe, jak animacja. Przeglądarki mogą również wybrać animację, ale nie wiem, czy w ogóle. Te sekwencje Unicode są wyświetlane przez przeglądarkę jako tekst Unicode, więc dokładny wygląd (kolor lub nie, animowane lub nie,...) zależy od systemu renderowania tekstu używanego przez przeglądarkę. Wygląd danego emoji Unicode zależy również od dowolnych selektorów zmienności Unicode i modyfikatorów emoji , które pojawiają się w pobliżu niego w sekwencji punktów kodu Unicode. W przeciwieństwie do spamu emoji opartego na obrazkach, te sekwencje mogą być kopiowane i wklejane z przeglądarki i do innych aplikacji jako tekst Unicode.

  • Mam nadzieję, że wielu marketerów czytających to pytanie StackOverflow po prostu powie nie. To okropny pomysł, aby włączyć te sekwencje w temacie wiadomości e-mail i natychmiast zniszczy ciebie i Twoją markę jako lowlife spamerów. Nie jest to warte "uwagi", którą otrzyma twój e-mail.

  • Oczywiście pierwsze pytanie, które przychodzi każdemu do głowy, brzmi: "jak pozbyć się te rzeczy?"Na szczęście istnieje open-source Greasemonkey/Tampermonkey / Violentmonkey userscript:

Gmail Subject Line Emoji Roach Motel

Ten userscript eliminuje zarówno HTML-image (dzięki niesamowitej pracy Alexandra O ' Mara), jak i pure-Unicode.

Dla tego drugiego typu, userscript Zawiera wyrażenie regularne przeznaczone do przechwytywania sekwencji Unicode, które mogą być nadużywane przez marketerów. Regex wygląda tak w ES6 Javascript (userscript tłumaczy to na powszechnie obsługiwane regex pre-ES6 przy użyciu niesamowitego Transpilera ES6 Regex):

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
 0
Author: Louis Semprini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 23:02:22