2013-04-19 1 views
0

IMAP 프로토콜을 사용하여 전자 메일 메시지의 텍스트/HTML BODY 부분을 얻습니다. 이를 위해IMAP에서 알 수없는 인코딩 메시지

, 나는 무엇을 다음 BODY[INDEX] 전화를 사용 BODY 지수와 일부의 캐릭터 세트를 얻기 위해 BODYSTRUCTURE 전화를 사용하는 원시 텍스트를 취득하고, 파이썬 디코딩 기능을 사용하여 디코딩을 시도한다.

이제는 주어진 문자 집합 (해당 부분과 함께 BODYSTRUCTURE 호출에서 얻은 charset)으로 일부 텍스트 부분을 디코딩 한 후에도 알 수없는 인코딩으로 인코딩됩니다.

포르투갈어/스페인어/기타 라틴 텍스트에만이 문제가 발생하므로이 종류의 포르투갈어/스페인어 인코딩이라고 가정합니다.

이제 내 문제는이 발생을 감지하고 올바르게 디코딩하는 것입니다. 무엇보다도 인코딩 된 문자를 사용하지 않고 텍스트를 디코딩하는 것은 인코딩 된 문자를 사용하지 않는 것이 좋지만 지금 일어나고있는 상황에서 이러한 문자를 디코딩하는 보편적 인 방법을 찾는 방법은 무엇입니까?

일반 문자셋 목록을 시도해보고 try:except:주기를 수행하여 주어진 텍스트를 시도하고 해독하는 모든 과정을 수행한다고 가정하지만, 솔직히 더 나은 솔루션을 선호합니다. 인코딩 된 텍스트의

# Obtain BODYSTRUCTURE call 
data, result = imap_instance.uid('fetch', email_uid, '(BODYSTRUCTURE)') 
part_body_index, part_charset = parse_BODY_index_and_charset_from_response(data) 

text_part, result = imap_instance.uid('fetch', email_uid, '(BODY['+str(part_body_index)+'])') 

if len(part_charset) > 0: 
    try: 
     text_part = text_part.decode(part_charset, 'ignore') 
    except: 
     pass 

# Content of "text_part" variable after this should be text with no encoded characters... 
# But that's not the case 

예 :

의사 코드는이 같은 것입니다

A 05/04/2013, =E0s 11:09, XYZ escreveu:> 

이 텍스트는 ISO-8859-1로 인코딩 된, 여전히 같은 그것을 디코딩. 문자열의 기호 = E0은 문자 "À"입니다.

In=EDcio da mensagem reenviada: 

이 텍스트는 Windows-1252로 인코딩되어 있으며, 여전히 이것을 좋아합니다. 문자열의 기호 = ED는 문자 "í"입니다.

답변

2

Content-Transfer-Encoding 정보 (실제로는 BODYSTRUCTURE 응답에 표시됨)를 확인해야합니다. base64quoted-printable 디코딩을 모두 지원해야합니다. 이는 바이너리 데이터 (UTF-8 또는 지정된 텍스트의 ISO-8859-1 인코딩)를 전자 메일 전송에 안전한 7 비트 형식으로 변환합니다. 콘텐츠 인코딩을 취소 한 후에는 UTF-8, Windows-1250 또는 ISO-8859-x 같은 문자 인코딩에서 해당 유니 코드 표현으로 텍스트를 디코딩해야합니다. 당신은 함께 일합니다.

두 예제 모두 quoted-printable을 사용하여 인코딩됩니다.

+0

빠른 답변을 보내 주셔서 감사합니다. 이것이 바로 Content-Transfer-Encoding 문제인 경우 지금 바로 시도하고 올바른 대답으로 표시 할 것입니다. –

+0

@VascoPatricio : ** ** '콘텐츠 전송 인코딩'문제입니다. –

+0

실제로 그랬습니다. 받아 들여지고 해결 된 것. 고마워. –