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


103

我知道Data 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

@bambams是什么意思?
雷沃

13
正如您所说,它们令人讨厌,并且仅被垃圾邮件发送者使用。我希望Gmail不会显示它们(它似乎已经检测到99%为垃圾邮件)。
bambams

1
这是如何阻止它们
jamesmstone '16

jamesmstone的链接显示了如何阻止消息;如果您想自己屏蔽表情符号并留下消息,请使用Gmail主题行表情符号Roach Motel用户脚本。
路易·森普里尼

Answers:


175

简短的介绍:

在内部将它们称为goomoji,并且它们似乎是非标准的UTF-8扩展名。当Gmail遇到这些字符之一时,将被相应的图标替换。我找不到关于它们的任何文档,但可以对格式进行反向工程。


这些图标是什么?

这些图标实际上是显示在“插入图释”面板下的图标。

Gmail插入表情符号

虽然我没有52E在列表中看到该图标,但还有其他几个遵循相同的约定。

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


数据URI是什么?

尽管它确实有一些相似之处,但它实际上不是数据URI。实际上,这是在RFC 2047中定义的用于在电子邮件主题中编码非ASCII字符的特殊语法。基本上,它是这样的。

=?charset?encoding?data?=

因此,在示例字符串中,我们具有以下数据。

=?UTF-8?B?876Urg==?=
  • charset = UTF-8
  • encoding= B(表示base64)
  • data = 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

如您所见,除了可以FEgoomoji图标与其他UTF-8字符区分开的前缀之外,它与52E图标URL中的匹配。一些测试证明,这对于其他图标也适用。


听起来需要做很多工作,有转换器吗?:

这当然可以编写脚本。我为测试创建了以下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
这是一个了不起的完整答案。我无话可说,但我只是想知道您是如何进行逆向工程的呢!谢谢亚历山大。
雷沃

2
B特殊语法暗示Base64 的断言可能是一个猜测(如果您之前看过,则该字符串看起来像是Base64编码的字符串);之后,不难发现这四个字节遵循Unicode字符的UTF-8模式之一,尤其是因为他正在寻找Unicode。这是非常酷的侦探工作,都一样:)
sameers

3
@sameers无需猜测B-它在#4中定义

最好在上面的答案中提及RFC作为参考。
sameers

@JeremyMiller感谢您跟踪相关的RFC!我在写此答案时找不到它。
亚历山大·奥玛拉

19

如果您使用正确的十六进制代码点(例如fe4f4表示“ poo of poo”),并且在主题行标题中正确编码,则将其设为base64(请参阅@AlexanderOMara)或带引号的可打印字符(=?utf-8?Q?=F3=BE=93=B4?=),Gmail会自动解析并替换为对应的表情符号。

这是Gmail表情符号列表,用于复制和粘贴到主题行或电子邮件正文中。动画表情符号将在收件箱中引起更多关注,它们放置在黄色背景上:

emailmarketingtipps.de上的Gmail表情符号


0

非常感谢Alexander O'Mara提供了有关带有goomoji标签的HTML图像的精心研究的答案!

我只想添加三件事:

  • 仍然有许多表情符号(以及其他生成图像的Unicode序列),垃圾邮件制造者和其他以前的营销人员已开始在电子邮件主题行中使用,并且gmail无法转换为HTML图像。在某些浏览器中,它们显示为粗体和彩色,几乎与动画一样糟糕。浏览器可以选择对它们进行动画处理,但是我不知道是否可以这样做。这些Unicode序列在浏览器中显示为Unicode文本,因此确切的外观(是否有颜色,是否有动画,...)取决于浏览器所使用的文本呈现系统。给定Unicode表情符号的外观还取决于任何Unicode变体选择器和表情符号修饰符在Unicode代码点序列中出现在它附近的字符。与基于图像的表情符号垃圾邮件不同,这些序列可以作为Unicode文本从浏览器复制粘贴到其他应用程序中。

  • 我希望许多阅读StackOverflow问题的营销人员只会拒绝。将这些序列包含在您的电子邮件主题行中是一个可怕的想法,它会立即使您和您的品牌成为低级垃圾邮件发送者。您的电子邮件会引起“关注”,这是不值得的。

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

Gmail主题行表情符号蟑螂汽车旅馆

该用户脚本消除了HTML图像(由于Alexander O'Mara的出色工作)和纯Unicode类型。

对于后一种类型,用户脚本包括一个正则表达式,旨在捕获可能被营销人员滥用的Unicode序列。regex在ES6 Javascript中看起来像这样(用户脚本使用令人惊叹的ES6 Regex Transpiler将其转换为广泛支持的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.