我有很多的电子邮件来自不同的来源。他们都有附件,他们中的许多附件名称在中国,所以这些 名称转变为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字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top