如何告诉我们,如果一个base64string是或不是
题
我有很多的电子邮件来自不同的来源。他们都有附件,他们中的许多附件名称在中国,所以这些 名称转变为base64通过他们的电子邮件的客户。
当我收到这些电子邮件,我希望解码的名称。但还有其他名称 不base64.我怎么可以区分是否base64string是或不是,使用 script 编程语言?
Ie。
第一个附件:
------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
name="Copy of Book1.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="Copy of Book1.xls"
第二个附件:
------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
请注意"内容传送编码"有base64
解决方案
请注意
Content-Transfer-Encoding
有base64
不相关的,在这种情况下, Content-Transfer-Encoding
仅适用于身体有效载荷,不到头。
=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
这是一个 RFC2047-编码头的原子。该标准库功能,对它进行解码是 email.header.decode_header
.它仍然需要一点后处理解释的结果功能:
import email.header
x= '=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?='
try:
name= u''.join([
unicode(b, e or 'ascii') for b, e in email.header.decode_header(x)
])
except email.Errors.HeaderParseError:
pass # leave name as it was
但是...
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
这是完全错误的。什么邮件创造了它?RFC2047编码只能发生在原子,并援引串不是一个原子。RFC2047§5明确拒绝这样的:
- 一个'encoded-word'必须不出现在一个'quoted-string'.
所接受的方式来进行编码参数的标题当长串或Unicode字是本是 RFC2231, ,这是一个全新的袋子的伤害。但你应该使用的标准邮件分析图书馆将配合你。
所以,你可以检测 '=?'
在文件的参数,如果你想要,并尝试解它通过RFC2047.然而,严格来说正确的事情要做的是采取邮寄者在其词和真正的叫文件 =?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
!
其他提示
标题值告诉您:
=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?= "=?" introduces an encoded value "gb2312" denotes the character encoding of the original value "B" denotes that B-encoding (equal to Base64) was used (the alternative is "Q", which refers to something close to quoted-printable) "?" functions as a separator "uLG..." is the actual value, encoded using the encoding specified before "?=" ends the encoded value
分裂为“?”实际上得到你(JSON表示法)
["=", "gb2312", "B", "uLGxvmhlbrixsb5nLnhscw==", "="]
在得到的数组中,如果“B”,则为“B”。在位置2上,你在第3个位置面对一个base-64编码的字符串。一旦解码它,一定要注意位置1的编码,可能最好将整个事物转换为UTF-8使用它资讯
@gnud,@ edg - 除非我误解,否则他会询问文件名,而不是文件内容 @setori - Content-Trasfer-Encoding告诉你如何编码文件的内容,而不是“文件名”。
我不是专家,但文件名中的这一部分告诉他下面的字符:
=?GB2312 2 B 4
我正在寻找RFC中的文档......啊!这是: http://tools.ietf.org/html/rfc2047
RFC说:
通常,“编码字”是指“编码字”。是一系列可打印的ASCII字符,以“=?”开头,以“?=”结尾,中间有两个“?”。
要查看的其他内容是SharpMimeTools中的代码,我在错误中使用的MIME解析器(在C#中)跟踪应用, BugTracker.NET
有一种比bobince方法更好的方法来处理 decode_header
的输出。我在这里找到了它: http://mail.python.org /pipermail/email-sig/2007-March/000332.html
name = unicode(email.header.make_header(email.header.decode_header(x)))
好吧,您将电子邮件标题解析为字典。然后检查是否设置了Content-Transfer-Encoding,如果它=“base64”,则检查或“base-64”。
问题:“"”而且我实际上还需要知道它是什么类型的文件,即.xls或.doc所以我需要解码文件名才能正确处理附件,但如上所述,似乎jython不支持gb2312,知道任何环形交叉口吗?"""
数据:
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
观察:
(1)第一行表示Microsoft Excel,因此 .xls
看起来比 .doc
(2)
>>> import base64
>>> base64.b64decode("uLGxvmhlbrixsb5nLnhscw==")
'\xb8\xb1\xb1\xbehen\xb8\xb1\xb1\xbeg.xls'
>>>
(a)扩展名似乎是 .xls
- 不需要 gb2312
编解码器
(b)如果你想要一个文件系统安全的文件名,你可以使用“-_”和base64的变体或者你可以对它进行百分比编码
(c)对于它的价值,文件名是 XYhenXYg.xls
,其中X和Y是2个汉字,它们一起表示“复制”。其余是字面的ASCII字符。