Gmail 电子邮件主题中的动画图标

Gmail 电子邮件主题中的动画图标,gmail,base64,data-uri,Gmail,Base64,Data Uri,我知道数据URIs,其中编码的数据可以内联使用,例如图像。今天我收到一封邮件,实际上是垃圾邮件,邮件主题中有一个动画(gif)图标: 这里只有一个图标: 所以我唯一想到的就是关于数据URI,以及Gmail是否允许在主题中插入某种表情符号。我看到了电子邮件的完整详细版本,并指向下图的主题行: 所以GIF来自于编码字符串,类似于数据URI模式,但我无法从中提取图标。以下是元素HTML源代码: 长话短说,https://mail.google.com/mail/e/XXX其中XXX是十六进制数

我知道数据URIs,其中编码的数据可以内联使用,例如图像。今天我收到一封邮件,实际上是垃圾邮件,邮件主题中有一个动画(gif)图标:

这里只有一个图标:

所以我唯一想到的就是关于数据URI,以及Gmail是否允许在主题中插入某种表情符号。我看到了电子邮件的完整详细版本,并指向下图的主题行:

所以GIF来自于编码字符串,类似于数据URI模式,但我无法从中提取图标。以下是元素HTML源代码:

长话短说,
https://mail.google.com/mail/e/XXX
其中
XXX
是十六进制数。它们没有任何记录,或者我找不到。如果这是关于数据URI的,那么如何将它们包含在Gmail的电子邮件主题中呢?(我将该电子邮件转发到雅虎电子邮件帐户,看到的是
[?]
而不是图标),如果不是,那么该编码字符串是如何解析的?

简短描述: 它们在内部称为
goomoji
,似乎是非标准的UTF-8扩展。当Gmail遇到其中一个字符时,它会被相应的图标所取代。我找不到关于它们的任何文档,但我能够对格式进行反向工程


这些图标是什么? 这些图标实际上是显示在“插入表情”面板下的图标

虽然我没有看到列表中的图标,但还有其他几个图标遵循相同的惯例

请注意,还有一些图标的名称是前缀,例如。我无法确定这些图标是否可以或如何以这种方式使用


什么是数据URI? 虽然它有一些相似之处,但实际上它不是一个。它实际上是一种特殊的语法,用于编码电子邮件主题中的非ASCII字符,在中定义。基本上,它是这样工作的

=?charset?encoding?data?=
因此,在我们的示例字符串中,我们有以下数据

=?UTF-8?B?876Urg==?=
  • charset
    =
    UTF-8
  • 编码
    =
    B
    (表示base64)
  • 数据
    =
    876Urg==

那么,它是如何工作的呢? 我们知道,不知何故,
876Urg==
意味着图标
52E
,但如何

如果我们使用base64解码
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字符),它与图标URL中的
52E
匹配。一些测试证明,其他图标也是如此


听起来工作量很大,有转换器吗 当然,这是可以编写脚本的。我为测试创建了以下Python代码。这些函数可以将base64编码字符串与URL中的短十六进制字符串进行转换。注意,这段代码是为Python3编写的,与Python2不兼容

转换功能: 示例: 输出: 当然,找到图标的URL只需要在Gmail中创建一个新的草稿,插入所需的图标,并使用浏览器的DOM检查器即可


如果您使用了正确的十六进制代码点(例如),并且在主题行标题中正确编码,则将其设为base64(请参见@AlexanderOMara)或引用的可打印(
=?utf-8?Q?=F3=be=93=B4?=
),然后Gmail将自动解析并用相应的表情符号替换它

-或电子邮件正文。将在收件箱中吸引更多注意力的动画表情符号放在黄色背景上:

非常感谢您对goomoji标记的HTML图像提供了如此深入研究的答案

我只想补充三点:

  • 还有许多表情符号(以及其他生成图片的Unicode序列),垃圾邮件发送者和其他昔日的营销者开始在电子邮件主题行中使用,gmail不会转换为HTML图像。在某些浏览器中,这些内容显示为粗体和彩色,这几乎和动画一样糟糕。浏览器也可以选择设置这些动画,但我不知道是否有。这些Unicode序列由浏览器显示为Unicode文本,因此确切的外观(颜色与否、动画与否等)取决于浏览器使用的文本呈现系统。给定Unicode表情符号的外观还取决于Unicode代码点序列中出现在其附近的任何表情符号。与基于图像的表情符号垃圾邮件不同,这些序列可以作为Unicode文本从浏览器复制并粘贴到其他应用程序中

  • 我希望读到这个问题的许多营销人员会说不。在你的电子邮件主题行中包含这些序列是一个可怕的想法,它会立即玷污你和你的品牌,使你成为低俗的垃圾邮件发送者。它不值得你的电子邮件得到“关注”

  • 当然,每个人想到的第一个问题是:“我如何摆脱这些东西?”幸运的是,有一个开源的Greasemonkey/Tampermonkey/Violentmonkey用户脚本:

这个用户脚本消除了HTML图像(由于出色的工作)和纯Unicode类型

对于后一种类型,userscript包含一个正则表达式,用于捕获可能被营销人员滥用的Unicode序列。正则表达式在ES6 Javascript中类似于此(用户脚本使用惊人的代码将其转换为广泛支持的ES6之前的正则表达式):

这是一个令人惊奇的全集
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==
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