Ikon animasi di subjek email

103

Saya tahu tentang URI Data di mana base64data yang dikodekan dapat digunakan sebaris seperti gambar. Hari ini saya menerima email yang sebenarnya adalah email spam yang di dalamnya terdapat ikon animasi (gif) di subjeknya:

masukkan deskripsi gambar di sini

Ini ikonnya saja:

masukkan deskripsi gambar di sini

Jadi satu-satunya hal yang terlintas dalam pikiran saya adalah tentang Data URI dan jika Gmail mengizinkan semacam emotikon untuk dimasukkan ke dalam subjek. Saya melihat versi lengkap email dan menunjuk ke baris subjek pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Jadi GIF berasal dari =?UTF-8?B?876Urg==?=string yang disandikan yang mirip dengan skema URI Data namun saya tidak bisa mengeluarkan ikonnya. Berikut adalah sumber elemen HTML:

masukkan deskripsi gambar di sini

Singkat cerita, ada banyak emoticon dari https://mail.google.com/mail/e/XXXmana XXXada bilangan heksadesimal. Mereka tidak didokumentasikan di mana pun atau saya tidak dapat menemukannya. Jika itu tentang URI Data, jadi bagaimana mungkin menyertakannya dalam subjek email Gmail? (Saya meneruskan email itu ke akun email yahoo, melihat [?]alih-alih ikon) dan jika tidak, lalu bagaimana string yang dikodekan itu diurai?

revo
sumber
25
Pertanyaan sebenarnya adalah bagaimana Anda memblokir mereka ?!
bambam
@bambams Apa maksudmu?
revo
13
Mereka sangat menjengkelkan dan seperti yang Anda katakan, mereka hanya digunakan oleh pengirim spam. Saya lebih suka mereka tidak ditampilkan oleh Gmail (sepertinya sudah mendeteksi 99% sebagai spam).
bambam
1
berikut adalah cara memblokirnya
jamesmstone
Link jamesmstone menunjukkan cara memblokir pesan; jika Anda ingin memblokir emoji itu sendiri dan meninggalkan pesan, gunakan userscript Gmail Subject Line Emoji Roach Motel .
Louis Semprini

Jawaban:

175

Deskripsi Singkat:

Mereka dirujuk secara internal sebagai goomoji, dan tampaknya merupakan ekstensi UTF-8 non-standar. Saat Gmail menemukan salah satu karakter ini, itu diganti dengan ikon yang sesuai. Saya tidak dapat menemukan dokumentasi apa pun tentangnya, tetapi saya dapat merekayasa balik formatnya.


Apakah ikon-ikon ini?

Ikon tersebut sebenarnya adalah ikon yang muncul di bawah panel "Sisipkan emotikon".

Gmail Menyisipkan Emotikon

Meskipun saya tidak melihat 52Eikon di daftar, ada beberapa lainnya yang mengikuti konvensi yang sama.

Perhatikan bahwa ada juga beberapa ikon yang namanya diawali, seperti . Saya tidak dapat menentukan apakah atau bagaimana ikon ini dapat digunakan dengan cara ini.gtalk.03C gtalk.03C


Apa URI Data ini?

Ini sebenarnya bukan URI Data , meskipun memiliki beberapa kesamaan. Ini sebenarnya adalah sintaks khusus untuk mengenkode karakter non-ASCII dalam subjek email, ditentukan dalam RFC 2047 . Pada dasarnya, cara kerjanya seperti ini.

=?charset?encoding?data?=

Jadi, dalam string contoh kami, kami memiliki data berikut.

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


Lantas, bagaimana cara kerjanya?

Kita tahu bahwa entah bagaimana 876Urg==berarti ikon 52E, tapi bagaimana caranya?

Jika kita decode base64 876Urg==, kita dapatkan 0xf3be94ae. Ini terlihat seperti berikut dalam biner:

11110011 10111110 10010100 10101110

Bit ini konsisten dengan karakter yang dikodekan UTF-8 4-byte.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Jadi bit yang relevan adalah sebagai berikut:

     011   111110   010100   101110

Atau saat disejajarkan:

00001111 11100101 00101110

Dalam heksadesimal, byte ini adalah sebagai berikut:

FE52E

Seperti yang Anda lihat, kecuali untuk FEawalan yang mungkin untuk membedakan goomojiikon dari karakter UTF-8 lainnya, itu cocok dengan 52Edi URL ikon. Beberapa pengujian membuktikan bahwa hal ini berlaku untuk ikon lainnya.


Kedengarannya banyak pekerjaan, apakah ada konverter ?:

Ini tentu saja bisa dibuat skrip. Saya membuat kode Python berikut untuk pengujian saya. Fungsi ini dapat mengonversi string yang disandikan base64 ke dan dari string heksa pendek yang ditemukan di URL. Perhatikan, kode ini ditulis untuk Python 3, dan tidak kompatibel dengan Python 2.

Fungsi konversi:

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

Contoh:

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

Keluaran:

52E
876Urg==

Dan, tentu saja, menemukan URL ikon hanya perlu membuat draf baru di Gmail, memasukkan ikon yang Anda inginkan, dan menggunakan pemeriksa DOM browser Anda.

Pemeriksa DOM

Alexander O'Mara
sumber
14
Itu jawaban lengkap yang luar biasa. Saya tidak punya apa-apa untuk dikatakan tapi saya hanya ingin tahu bagaimana Anda melakukan rekayasa terbalik itu !! Terima kasih Alexander.
revo
2
Penegasan bahwa Bdalam sintaks khusus menyiratkan Base64 mungkin merupakan tebakan (string di akhir terlihat seperti string yang dikodekan Base64, jika Anda pernah melihatnya sebelumnya); setelah itu tidak sulit untuk melihat bahwa empat byte mengikuti salah satu pola UTF-8 untuk karakter Unicode, terutama karena dia mencari Unicode. Ini pekerjaan detektif yang cukup keren, semua sama :)
sameers
3
@sameers Tidak perlu menebak-nebak B- ini ditentukan di # 4
Ada baiknya menyebutkan RFC pada jawaban di atas, sebagai referensi.
sameers
@JeremyMiller Terima kasih telah melacak RFC yang relevan! Saya tidak dapat menemukannya ketika saya menulis jawaban ini.
Alexander O'Mara
19

Jika Anda menggunakan titik kode hex yang benar (mis. Fe4f4 untuk 'tumpukan kotoran' ) dan Jika dikodekan dengan benar di dalam tajuk baris subjek, biarkan itu menjadi base64 (lihat @AlexanderOMara) atau dikutip-printable ( =?utf-8?Q?=F3=BE=93=B4?=), maka Gmail akan secara otomatis parse dan ganti dengan emoji yang sesuai.

Berikut daftar emoji Gmail untuk disalin dan ditempel ke baris subjek - atau badan email. Emoji animasi, yang akan menarik lebih banyak perhatian di kotak masuk, ditempatkan pada latar belakang kuning:

Emoji Gmail di emailmarketingtipps.de

LukeA
sumber
0

Terima kasih banyak kepada Alexander O'Mara atas jawaban yang telah diteliti dengan baik tentang gambar HTML yang diberi tag goomoji!

Saya hanya ingin menambahkan tiga hal:

  • Masih banyak emoji (dan urutan Unicode lain yang menghasilkan gambar) yang para spammer dan pemasar lainnya mulai gunakan di baris subjek email dan gmail tidak dikonversi ke gambar HTML. Di beberapa browser, gambar ini tampil tebal dan berwarna, yang hampir sama buruknya dengan animasi. Browser juga dapat memilih untuk menganimasikan ini, tetapi saya tidak tahu apakah ada yang melakukannya. Urutan Unicode ini ditampilkan oleh browser sebagai teks Unicode, jadi tampilan persisnya (warna atau tidak, animasi atau tidak, ...) bergantung pada sistem rendering teks yang digunakan browser. Munculnya emoji Unicode tertentu juga bergantung pada pemilih variasi Unicode dan pengubah emojiyang muncul di dekatnya dalam urutan titik kode Unicode. Tidak seperti spam emoji berbasis gambar, urutan ini dapat disalin dan ditempel dari browser dan ke aplikasi lain sebagai teks Unicode.

  • Saya berharap banyak pemasar yang membaca pertanyaan StackOverflow ini akan menjawab tidak. Merupakan ide yang buruk untuk memasukkan urutan ini ke dalam baris subjek email Anda dan itu akan segera menodai Anda dan merek Anda sebagai spammer kelas bawah. Tidak sepadan dengan "perhatian" yang didapat email Anda.

  • Tentu saja pertanyaan pertama yang muncul di benak setiap orang adalah: "bagaimana cara menyingkirkan hal-hal ini?" Untungnya ada Greasemonkey / Tampermonkey / Violentmonkey userscript open-source ini:

Motel Baris Subjek Gmail Emoji Roach

Skrip pengguna ini menghilangkan kedua gambar HTML (berkat karya mengagumkan dari Alexander O'Mara ) dan jenis Unicode murni.

Untuk jenis yang terakhir, userscript menyertakan ekspresi reguler yang dirancang untuk menangkap urutan Unicode yang kemungkinan besar akan disalahgunakan oleh pemasar. Regex terlihat seperti ini di ES6 Javascript (skrip pengguna menerjemahkan ini ke regex pra-ES6 yang didukung secara luas menggunakan ES6 Regex Transpiler yang luar biasa ):

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
sumber