Biểu tượng hoạt hình trong chủ đề email


103

Tôi biết về các URI dữ liệu trong đó base64dữ liệu được mã hóa có thể được sử dụng nội tuyến chẳng hạn như hình ảnh. Hôm nay tôi nhận được một email thực sự là một thư rác trong đó có một biểu tượng động (gif) trong chủ đề của nó:

nhập mô tả hình ảnh ở đây

Đây là biểu tượng một mình:

nhập mô tả hình ảnh ở đây

Vì vậy, điều duy nhất tôi nghĩ đến là tất cả về URI dữ liệu và nếu Gmail cho phép chèn một số loại biểu tượng cảm xúc vào chủ đề. Tôi đã xem phiên bản chi tiết đầy đủ của email và chỉ vào dòng tiêu đề ở hình bên dưới:

nhập mô tả hình ảnh ở đây

Vì vậy, GIF đến từ =?UTF-8?B?876Urg==?=chuỗi được mã hóa tương tự như lược đồ URI dữ liệu, tuy nhiên tôi không thể lấy biểu tượng ra khỏi nó. Đây là nguồn HTML phần tử:

nhập mô tả hình ảnh ở đây

Dài truyện ngắn, có rất nhiều biểu tượng cảm xúc từ https://mail.google.com/mail/e/XXXnơi XXXlà số thập lục phân. Chúng không được ghi lại ở đâu hoặc tôi không thể tìm thấy nó. Nếu đó là về URI dữ liệu, vậy làm cách nào để có thể đưa chúng vào chủ đề email của Gmail? (Tôi đã chuyển tiếp email đó đến tài khoản email yahoo, thấy [?]thay vì biểu tượng) và nếu không, thì chuỗi mã hóa đó được phân tích cú pháp như thế nào?


25
Câu hỏi thực sự là làm thế nào để bạn chặn chúng ?!
bambams,

@bambams Ý bạn là gì?
revo

13
Chúng cực kỳ khó chịu và như bạn đã nói chúng chỉ được sử dụng bởi những kẻ gửi thư rác. Tôi thà rằng chúng không được Gmail hiển thị (dường như đã phát hiện ra 99% là spam).
bambams

1
đây là cách để chặn họ
jamesmstone

liên kết của jamesmstone chỉ ra cách chặn tin nhắn; nếu bạn muốn tự chặn biểu tượng cảm xúc và để lại tin nhắn, hãy sử dụng bản ghi người dùng Dòng chủ đề của Gmail Emoji Roach Motel .
Louis Semprini

Câu trả lời:


175

Mô tả ngắn:

Chúng được gọi nội bộ là goomoji, và chúng dường như là một phần mở rộng UTF-8 không chuẩn. Khi Gmail gặp một trong các ký tự này, nó sẽ được thay thế bằng biểu tượng tương ứng. Tôi không thể tìm thấy bất kỳ tài liệu nào về chúng, nhưng tôi đã có thể thiết kế ngược lại định dạng.


Những biểu tượng này là gì?

Những biểu tượng đó thực sự là những biểu tượng xuất hiện trong bảng "Chèn biểu tượng cảm xúc".

Gmail Chèn biểu tượng cảm xúc

Mặc dù tôi không thấy 52Ebiểu tượng trong danh sách, nhưng có một số biểu tượng khác tuân theo quy ước tương tự.

Lưu ý rằng cũng có một số biểu tượng có tên được đặt trước, chẳng hạn như . Tôi không thể xác định liệu các biểu tượng này có thể được sử dụng theo cách này hay không.gtalk.03C gtalk.03C


Điều này URI dữ liệu là gì?

Nó không thực sự là một URI dữ liệu , mặc dù nó có một số điểm tương đồng. Nó thực sự là một cú pháp đặc biệt để mã hóa các ký tự không phải ASCII trong các chủ đề email, được định nghĩa trong RFC 2047 . Về cơ bản, nó hoạt động như thế này.

=?charset?encoding?data?=

Vì vậy, trong chuỗi ví dụ của chúng tôi, chúng tôi có dữ liệu sau.

=?UTF-8?B?876Urg==?=
  • charset = UTF-8
  • encoding= B(có nghĩa là base64)
  • data = 876Urg==


Vì vậy, làm thế nào nó hoạt động?

Chúng tôi biết rằng bằng cách nào đó, 876Urg==có nghĩa là biểu tượng 52E, nhưng làm thế nào?

Nếu chúng tôi giải mã base64 876Urg==, chúng tôi nhận được 0xf3be94ae. Điều này trông giống như sau trong hệ nhị phân:

11110011 10111110 10010100 10101110

Các bit này phù hợp với một ký tự được mã hóa UTF-8 4 byte.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Vì vậy, các bit có liên quan như sau:

     011   111110   010100   101110

Hoặc khi căn chỉnh:

00001111 11100101 00101110

Trong hệ thập lục phân, các byte này như sau:

FE52E

Như bạn có thể thấy, ngoại trừ FEtiền tố được cho là để phân biệt các goomojibiểu tượng với các ký tự UTF-8 khác, nó khớp với 52Etrong URL biểu tượng. Một số thử nghiệm chứng minh rằng điều này đúng với các biểu tượng khác.


Có vẻ như rất nhiều công việc, có công cụ chuyển đổi không ?:

Điều này tất nhiên có thể được viết theo kịch bản. Tôi đã tạo mã Python sau cho thử nghiệm của mình. Các hàm này có thể chuyển đổi chuỗi được mã hóa base64 thành và từ chuỗi hex ngắn được tìm thấy trong URL. Lưu ý, mã này được viết cho Python 3 và không tương thích với Python 2.

Các chức năng chuyển đổi:

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

Ví dụ:

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

Đầu ra:

52E
876Urg==

Và tất nhiên, việc tìm kiếm URL của biểu tượng chỉ cần tạo một bản nháp mới trong Gmail, chèn biểu tượng bạn muốn và sử dụng trình kiểm tra DOM của trình duyệt.

Trình kiểm tra DOM


14
Đó là một câu trả lời hoàn chỉnh đáng kinh ngạc. Tôi không có gì để nói nhưng tôi chỉ tự hỏi làm thế nào bạn làm một kỹ thuật đảo ngược trên đó !! Cảm ơn Alexander.
revo

2
Khẳng định rằng Btrong cú pháp đặc biệt ngụ ý rằng Base64 có thể là một phỏng đoán (chuỗi ở cuối loại trông giống như một chuỗi được mã hóa Base64, nếu bạn đã từng thấy chúng trước đây); sau đó không khó để nhận thấy rằng bốn byte tuân theo một trong các mẫu UTF-8 cho các ký tự Unicode, đặc biệt là vì anh ấy đang tìm kiếm Unicode. Đó là công việc trinh thám khá thú vị, tất cả đều giống nhau :)
sameers

3
@sameers Không cần phải đoán về B- đó là quy định tại # 4

Sẽ rất tốt nếu đề cập đến RFC trong câu trả lời ở trên, như một tài liệu tham khảo.
cùng

@JeremyMiller Cảm ơn bạn đã theo dõi RFC có liên quan! Tôi không thể tìm thấy nó khi tôi viết câu trả lời này.
Alexander O'Mara

19

Nếu bạn sử dụng đúng điểm mã hex (ví dụ: fe4f4 cho 'đống phân' ) và Nếu nó được mã hóa chính xác trong tiêu đề dòng chủ đề, hãy đặt nó là base64 (xem @AlexanderOMara) hoặc quote-printable ( =?utf-8?Q?=F3=BE=93=B4?=), thì Gmail sẽ tự động phân tích cú pháp và thay thế nó bằng biểu tượng cảm xúc tương ứng.

Đây là danh sách biểu tượng cảm xúc trong Gmail để sao chép và dán vào các dòng chủ đề - hoặc nội dung email. Các biểu tượng cảm xúc động, sẽ thu hút nhiều sự chú ý hơn trong hộp thư đến, được đặt trên nền màu vàng:

Biểu tượng cảm xúc Gmail trên emailmarketingtipps.de


0

Rất cảm ơn Alexander O'Mara về câu trả lời được nghiên cứu kỹ lưỡng về các hình ảnh HTML được gắn thẻ goomoji!

Tôi chỉ muốn thêm ba điều:

  • Vẫn còn nhiều biểu tượng cảm xúc (và các chuỗi Unicode khác tạo ra hình ảnh) mà những kẻ gửi thư rác và các nhà tiếp thị đầu tiên khác đang bắt đầu sử dụng trong các dòng tiêu đề email và gmail không chuyển đổi thành hình ảnh HTML. Trong một số trình duyệt, chúng hiển thị đậm và có màu, gần giống như hoạt ảnh. Các trình duyệt cũng có thể chọn để tạo hoạt ảnh cho những thứ này, nhưng tôi không biết liệu có làm như vậy không. Các chuỗi Unicode này được trình duyệt hiển thị dưới dạng văn bản Unicode, vì vậy hình thức chính xác (màu hay không, hoạt hình hay không, ...) phụ thuộc vào hệ thống kết xuất văn bản mà trình duyệt đang sử dụng. Sự xuất hiện của một biểu tượng cảm xúc Unicode nhất định cũng phụ thuộc vào bất kỳ bộ chọn biến thể Unicode nào và bộ sửa đổi biểu tượng cảm xúcxuất hiện gần nó trong chuỗi điểm mã Unicode. Không giống như spam biểu tượng cảm xúc dựa trên hình ảnh, các chuỗi này có thể được sao chép và dán ra khỏi trình duyệt và vào các ứng dụng khác dưới dạng văn bản Unicode.

  • Tôi hy vọng nhiều nhà tiếp thị đọc câu hỏi StackOverflow này sẽ chỉ nói không. Đó là một ý tưởng kinh khủng nếu đưa những chuỗi này vào dòng tiêu đề email của bạn và nó sẽ ngay lập tức khiến bạn và thương hiệu của bạn bị nhơ nhuốc như những kẻ gửi thư rác đời thấp. Nó không đáng để "chú ý" mà email của bạn sẽ nhận được.

  • Tất nhiên câu hỏi đầu tiên xuất hiện trong đầu mọi người là: "làm thế nào để tôi thoát khỏi những điều này?" May mắn thay, có mã nguồn mở Greasemonkey / Tampermonkey / Violentmonkey này:

Dòng chủ đề Gmail Emoji Roach Motel

Tập người dùng này loại bỏ cả hình ảnh HTML (nhờ công trình tuyệt vời của Alexander O'Mara ) và các loại Unicode thuần túy.

Đối với loại sau, tập người dùng bao gồm một biểu thức chính quy được thiết kế để nắm bắt các chuỗi Unicode có khả năng bị các nhà tiếp thị lạm dụng. Regex trông giống như thế này trong ES6 Javascript (usercript chuyển nó thành regex trước ES6 được hỗ trợ rộng rãi bằng cách sử dụng ES6 Regex Transpiler tuyệt vời ):

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.