我知道数据URI ,其中base64
编码数据可以内联使用,例如图片。今天我收到的电子邮件实际上是垃圾邮件,其主题中有一个动画(gif)图标:
这是单独的图标:
因此,我唯一想到的就是关于数据URI以及Gmail是否允许在主题中插入某种表情符号。我看到了电子邮件的完整详细版本,并在下图中指出了主题行:
所以GIF来自=?UTF-8?B?876Urg==?=
编码的字符串,它类似于数据URI方案但是我无法从中获取图标。这是元素HTML源:
长话短说,https://mail.google.com/mail/e/XXX
有许多表情符号,其中XXX
是十六进制数字。他们没有记录在案,或者我找不到它。如果这是关于数据URI,那么如何将它们包含在Gmail的电子邮件主题中呢? (我将该电子邮件转发到雅虎电子邮件帐户,看到[?]
而不是图标),如果不是,那么该编码字符串是如何解析的?
答案 0 :(得分:171)
它们在内部称为goomoji
,它们似乎是非标准的UTF-8扩展。当Gmail遇到其中一个字符时,它会被相应的图标替换。我无法找到任何关于它们的文档,但我能够对格式进行逆向工程。
这些图标实际上是“插入表情符号”面板下的图标。
虽然我没有在列表中看到52E
图标,但还有其他几个符合相同的惯例。
请注意,还有一些名称带有前缀的图标,例如gtalk.03C
。我无法确定这些图标是否或如何以这种方式使用。
它实际上不是Data 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
正如您所看到的,除了FE
前缀(可能是为了将goomoji
图标与其他UTF-8字符区分开来)之外,它与图标URL中的52E
相匹配。一些测试证明这适用于其他图标。
这当然可以编写脚本。我为我的测试创建了以下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==
当然,找到图标的网址只需要在Gmail中创建新草稿,插入所需图标,然后使用浏览器的DOM检查器。
答案 1 :(得分:18)
如果您使用正确的十六进制代码点(例如fe4f4 for 'pile of poo')并且如果它在主题行标题中正确编码,则将其设为base64(请参阅@AlexanderOMara)或quoted-printable(=?utf-8?Q?=F3=BE=93=B4?=
),然后Gmail将自动解析并用相应的表情符号替换它。
Here's a Gmail emoji list for copying and pasting into subject lines - 或电子邮件正文。动画表情符号会在收件箱中获得更多关注,它们放在黄色背景上:
答案 2 :(得分:0)
非常感谢Alexander O'Mara提供了有关带有goomoji标签的HTML图像的精心研究的答案!
我只想添加三件事:
仍然有许多表情符号(以及其他生成图像的Unicode序列),垃圾邮件制造者和其他以前的营销人员已开始在电子邮件主题行中使用它们,并且gmail无法转换为HTML图像。在某些浏览器中,它们显示为粗体和彩色,几乎与动画一样糟糕。浏览器可以也可以为其设置动画,但是我不知道是否可以这样做。这些Unicode序列在浏览器中显示为Unicode文本,因此确切的外观(是否有颜色,是否有动画,...)取决于浏览器所使用的文本呈现系统。给定的Unicode表情符号的外观还取决于在Unicode代码点序列中出现在其附近的任何Unicode variation selectors and emoji modifiers。与基于图像的表情符号垃圾邮件不同,这些序列可以作为Unicode文本从浏览器复制粘贴到其他应用程序中。
我希望阅读这个StackOverflow问题的许多营销人员只会拒绝。将这些序列包含在您的电子邮件主题行中是一个可怕的主意,它将立即使您和您的品牌成为低级垃圾邮件发送者。您的电子邮件会引起“关注”,这是不值得的。
当然,每个人都想到的第一个问题是:“我如何摆脱这些东西?”幸运的是,有一个开源的Greasemonkey / Tampermonkey / Violentmonkey用户脚本:
Gmail Subject Line Emoji Roach Motel
此用户脚本消除了HTML图像(由于Alexander O'Mara的出色表现)和纯Unicode类型。
对于后一种类型,用户脚本包含一个正则表达式,旨在捕获可能被营销人员滥用的Unicode序列。 regex在ES6 Javascript中看起来像这样(用户脚本使用令人惊叹的ES6 Regex Transpiler将其转换为广泛支持的ES6之前的正则表达式):
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