6

さまざまなソースから多くのメールが届いています。それらはすべて添付ファイルがあり、それらの多くは中国語の添付ファイル名を持っているため、これらの名前は電子メールクライアントによってbase64に変換されます。

これらのメールを受け取ったら、名前を解読したいと思います。しかし、base64ではない他の名前があります。jythonプログラミング言語を使用して、文字列がbase64であるかどうかをどのように区別できますか?

つまり。

最初の添付ファイル:

------=_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"

2番目の添付ファイル:

------=_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==?="  

「 Content-Transfer-Encoding」の両方にbase64があることに注意してください

4

6 に答える 6

21

ヘッダー値は次のことを示しています。

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

「=?」エンコードされた値を導入します
「gb2312」は、元の値の文字エンコードを示します
「B」は、B エンコーディング (Base64 に等しい) が使用されたことを示します (代替
         は "Q" で、quoted-printable に近いものを指します)
「?」セパレータとして機能します
「uLG...」は、前に指定されたエンコーディングを使用してエンコードされた実際の値です。
"?=" はエンコードされた値を終了します

では、「?」で分割します。実際にこれを取得します(JSON表記)

["=", "gb2312", "B", "uLGxvmhlbrixsb5nLnhscw==", "="]

結果の配列では、「B」が位置 2 にある場合、位置 3 に base-64 でエンコードされた文字列が表示されます。デコードしたら、位置 1 のエンコードに注意してください。おそらく変換するのが最善でしょう。その情報を使用してすべてをUTF-8に変換します。

于 2008-11-07T10:35:59.157 に答える
12

Content-Transfer-Encoding両方にbase64があることに注意してください

この場合は関係ありませんContent-Transfer-Encoding。ヘッダーではなく、本文のペイロードにのみ適用されます。

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

これはRFC2047でエンコードされたヘッダーアトムです。それをデコードするstdlib関数は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はこれを明示的に否定しています:

  • 「エンコードされた単語」は「引用符で囲まれた文字列」内に表示してはなりません(MUSTNOT)。

長い文字列またはUnicode文字が存在する場合にパラメータヘッダーをエンコードするために受け入れられている方法はRFC2231です。これは、まったく新しい問題です。ただし、これに対応できる標準のメール解析ライブラリを使用する必要があります。

したがって、必要に'=?'応じてin filenameパラメータを検出し、RFC2047を介してデコードしてみることができます。ただし、厳密に言えば正しいことは、メーラーをその言葉で理解し、実際にファイルを呼び出すことです=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

于 2008-11-07T11:38:38.970 に答える
7

@gnud、@edg - 私が誤解しない限り、彼はファイルの内容ではなくファイル名について尋ねています @setori - Content-Trasfer-Encoding は、「ファイル名」ではなく、ファイルの内容がどのようにエンコードされているかを示しています。

私は専門家ではありませんが、ファイル名のこの部分は、次の文字について彼に伝えています。

=?gb2312?B?

RFC でドキュメントを探しています...ああ!ここにあります:https://www.rfc-editor.org/rfc/rfc2047

RFC は次のように述べています。

一般に、「エンコードされた単語」は、「=?」で始まり、「?=」で終わり、間に 2 つの「?」がある印刷可能な ASCII 文字のシーケンスです。

他に確認すべきことは、バグ追跡アプリBugTracker.NETで使用する MIME パーサー (C#) である SharpMimeTools のコードです。

于 2008-11-07T10:24:32.753 に答える
2

の出力を処理するには、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)))
于 2009-11-06T13:58:52.103 に答える
0

質問: """また、ファイルの種類が .xls か .doc かを実際に知る必要があるため、添付ファイルを正しく処理するにはファイル名をデコードする必要がありますが、上記のように、gb2312 は jython でサポートされていないようです、ラウンドアバウトを知っていますか?"""

データ:

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は必要ありません (b) ファイル システムに安全なファイル名が必要な場合は、base64 の「-_」バリアントを使用するか、パーセント エンコードすることができます (c )価値があるのは、ファイル名は、XとYが一緒に「コピー」を意味する2つの漢字で、残りがリテラルASCII文字である場合です。gb2312

XYhenXYg.xls

于 2010-06-02T08:14:45.810 に答える
0

さて、あなたは電子メールのヘッダーを辞書に解析します。次に、Content-Transfer-Encoding が設定されているかどうか、およびそれが「base64」または「base-64」であるかどうかを確認します。

于 2008-11-07T10:17:08.820 に答える