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

rev*_*evo 103 gmail base64 data-uri

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

在此输入图像描述

这是仅图标:

在此输入图像描述

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

在此输入图像描述

所以GIF来自=?UTF-8?B?876Urg==?=编码字符串,类似于数据URI方案但是我无法从中获取图标.这是元素HTML源:

在此输入图像描述

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

Ale*_*ara 173

简短的介绍:

它们在内部被称为goomoji,它们似乎是非标准的UTF-8扩展.当Gmail遇到其中一个字符时,它会被相应的图标替换.我无法找到任何关于它们的文档,但我能够对格式进行反向工程.


这些图标是什么?

这些图标实际上是"插入图释"面板下显示的图标.

Gmail插入表情符号

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

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


这个数据URI是什么东西?

它实际上并不是一个数据URI,尽管它确实有一些相似之处.它实际上是一种特殊的语法,用于编码RFC 2047中定义的电子邮件主题中的非ASCII字符.基本上,它的工作原理如下.

=?charset?encoding?data?=
Run Code Online (Sandbox Code Playgroud)

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

=?UTF-8?B?876Urg==?=
Run Code Online (Sandbox Code Playgroud)
  • charset = UTF-8
  • encoding= B(表示base64)
  • data = 876Urg==


那么它是怎样工作的?

我们知道,不知何故,876Urg==意味着图标52E,但如何?

如果我们base64解码876Urg==,我们得到0xf3be94ae.这在二进制文件中如下所示:

11110011 10111110 10010100 10101110
Run Code Online (Sandbox Code Playgroud)

这些位与4字节UTF-8编码字符一致.

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Run Code Online (Sandbox Code Playgroud)

所以相关位如下:

     011   111110   010100   101110
Run Code Online (Sandbox Code Playgroud)

或者在对齐时:

00001111 11100101 00101110
Run Code Online (Sandbox Code Playgroud)

在十六进制中,这些字节如下:

FE52E
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,除了FE可能将goomoji图标与其他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')
Run Code Online (Sandbox Code Playgroud)

例子:

print(goomoji_decode('876Urg=='))
print(goomoji_encode('52E'))
Run Code Online (Sandbox Code Playgroud)

输出:

52E
876Urg==
Run Code Online (Sandbox Code Playgroud)

当然,找到图标的网址只需要在Gmail中创建新草稿,插入所需的图标,并使用浏览器的DOM检查器.

DOM Inspector

  • 这是一个惊人的完整答案.我没有什么可说的,但我只是想知道你是怎么对它进行逆向工程的!谢谢Alexander. (13认同)
  • @sameers无需猜测'B` - 它是[在#4中定义](http://www.faqs.org/rfcs/rfc2047.html) (3认同)
  • 特殊语法中的"B"暗示Base64的断言可能是一个猜测(如果您之前已经看过那些字符串,那么它的末尾类似于Base64编码的字符串); 之后,并不是很难注意到四个字节遵循Unicode字符的UTF-8模式之一,因为他正在寻找Unicode.这是非常酷的侦探工作,都一样:) (2认同)

luk*_*keA 18

如果您使用正确的十六进制代码点(例如fe4f4用于'poo poo')并且如果它在主题行标题中正确编码,则让它为base64(请参阅@AlexanderOMara)或quoted-printable(=?utf-8?Q?=F3=BE=93=B4?=),然后Gmail将自动解析并用相应的表情符号替换它.

这是一个Gmail表情符号列表,用于复制和粘贴到主题行 - 或电子邮件正文.动画表情符号会在收件箱中获得更多关注,它们被放置在黄色背景上:

在emailmarketingtipps.de上的Gmail表情符号