문제

다른 소스에서 많은 이메일이 들어오고 있습니다. 그들은 모두 첨부 파일을 가지고 있으며, 많은 사람들은 중국어로 첨부 파일 이름을 가지고 있으므로이 이름은 이메일 클라이언트에 의해 Base64로 변환됩니다.

이 이메일을 받으면 이름을 해독하고 싶습니다. 그러나 Base64가 아닌 다른 이름이 있습니다. 문자열이 Base64인지 아닌지를 어떻게 구별 할 수 있습니까? Jython 프로그래밍 언어?

즉.

첫 번째 첨부 파일 :

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

그게 an입니다 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==?="

이것은 단순히 잘못입니다. 어떤 Mailer가 만들었습니까? RFC2047 인코딩은 원자에서만 발생할 수 있으며, 인용 된 스트링은 원자가 아닙니다. RFC2047 §5는 이것을 명시 적으로 거부합니다.

  • '인코딩 된 단어'는 '인용문'내에 나타나지 않아야합니다.

긴 문자열 또는 유니 코드 문자가있을 때 매개 변수 헤더를 인코딩하는 허용되는 방법은 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"가 위치 2에있는 경우 위치 3에서 Base-64 인코딩 된 문자열에 직면 해 있습니다. 일단 해독 한 후에는 위치 1의 인코딩에주의를 기울여야합니다. 아마도 변환하는 것이 가장 좋습니다. 그 정보를 사용하여 UTF-8의 모든 것.

@gnud, @edg- 내가 오해하지 않는 한, 그는 파일 내용 @setori가 아닌 파일 이름에 대해 묻고 있습니다 - Content -Trasfer -Encoding은 "파일 이름"이 아니라 파일의 내용이 어떻게 인코딩되는지 알려줍니다.

나는 전문가가 아니지만 파일 이름 의이 부분은 다음과 같은 캐릭터에 대해 말하고 있습니다.

=? gb2312? b?

RFCS의 문서를 찾고 있습니다 ... 아! 여기있어: http://tools.ietf.org/html/rfc2047

RFC의 말 :

일반적으로 "인코딩 된 단어"는 "=?"로 시작하는 인쇄 가능한 ASCII 문자 시퀀스이며 "? ="로 끝나고 사이에 두 개 "?"가 있습니다.

다른 것을 볼 수있는 것은 Sharpmimetools의 코드, 내에서 사용하는 Mime Parser (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"인지 확인하십시오.

질문 : "" "또한 실제로 어떤 유형의 파일이 IE .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 - 필요 없음 gb2312 코덱
(b) 파일 시스템 안전 파일 이름을 원한다면 Base64의 "-_"변형을 사용할 수 있습니다.
(c) 가치가있는 것에 대해 파일 이름은 XYhenXYg.xls 여기서 x와 y는 함께 "복사"를 의미하고 나머지는 문자 그대로 ASCII 문자입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top