python3 읽은 메일의 디코딩 문제 해결

3127 단어 python우편물email
이 글을 보고 있는 당신을 누르면 어떤 모듈로 메일박스의 메일을 읽어도 "=?gb18030?B?1vfM4g==?="와 같은 혼란스러운 것을 볼 수 있습니다. 예를 들어 다음과 같습니다.
X-QQ-FEAT : YSSoAXAEBlFn3rgysgiXLVc6JAR+kPKEFS7ZN3zDXcfIwJbZ9PdiXyEAi1P1Y
	bCMaCcjuhodvyPMnINgRUNXG3cL92U6Wa65rugG8bzlK90FKrcQt1qc++MarPDuUQ9FZDWF
	5XCcMbh8cwE8DluYxQhB0KkjN3uwvo/LUe/yjAs9EPhaKMtOFcpleoSdhn3y50+HYLOlT+v
	6o1ezgettAtujDVDd12DnlM2A2TtGA+93HEKHtb87qPJew0CGt4Aol3ivf+TOwClGaVgmb3
	1OvgzIuQ/O86jp
X-QQ-SSF : 00010000000000F0
X-QQ-WAPMAIL : 1
X-QQ-BUSINESS-ORIGIN : 2
X-Originating-IP : 113.109.250.27
X-QQ-STYLE : 
X-QQ-mid : riamail18t1553668272t87493
From : "=?gb18030?B?MTExNDg1ODA5Ng==?=" 
To : "=?gb18030?B?ztLX1Ly6tcTTys/k?=" <[email protected]>
Subject : =?gb18030?B?1vfM4g==?=
Mime-Version : 1.0
Content-Type : multipart/alternative;
	boundary="----=_NextPart_5C9B18B0_09D441C0_7133BE76"
Content-Transfer-Encoding : 8Bit
Date : Wed, 27 Mar 2019 14:31:12 +0800
X-Priority : 3
Message-ID : 
X-QQ-MIME : TCMime 1.0 by Tencent
X-Mailer : QQMail 2.x
X-QQ-Mailer : QQMail 2.x

그러나 사실은 내용이 어떤 인코딩 형식을 통해 인코딩된 후에야 이런 내용이 드러났고, 우리가 얻은 후에는 이를 인코딩해야 한다.
인터넷상의 대부분 무엇은sys를 통과한다.setdefaultencoding("gbk"),base64.decodestring(s) 등은 모두python2를 기반으로 하고python3은python2에 비해 변동이 비교적 크기 때문에 일부 모듈이나 함수는 이미 사용하지 않고 근본적으로 가져오거나 호출하는 방법이 다르기 때문에 이 글이 있습니다.
 
해결 방법은 매우 간단하다. 인터넷상의 메일, 인코딩 형식이 매우 이상하기 때문에 우리가 해야 할 첫 번째 일도 가장 중요한 일이다. 바로 이 문자 내용이 도대체 어떤 인코딩 형식을 사용하여 인코딩했는지 아는 것이다. 그러면 뒤에 있는 것은 매우 간단하다. 이 대응하는 형식에 따라 당신이 받은 내용을 인코딩하면 된다.
 
구현 단계:
메일 내용을 어떻게 받았는지 그건 말하지 않겠습니다. 인터넷에서 큰 실례가 있습니다.
1단계: 모듈 가져오기:
        import email
        from email.header import decode_header
두 번째 줄에서 가져온 이 함수는 가장 중요한 것이다. 왜냐하면 인터넷에 있는 많은 사례들이python2이기 때문에 그들의 방법은 매우 간단하다. 따로 가져올 필요가 없다. 직접import는 하나의 이메일로 해결되고 이메일을 통해 할 수 있다.Header.decode_header () 는 호출을 실현하지만python3은 따로 가져오는 방법을 통해서만 이 함수를 호출할 수 있기 때문에 아무도 지도하지 않을 때 스스로 이것을 탐색하는 것도 사람을 매우 붕괴시키는 일이다.
 
두 번째 단계: 메일 내용을 메일 대상으로 변환하기:
        mail = email.message_from_bytes(bytes_content)
이bytes_콘텐츠는 메일을 읽는 관련 모듈fetch로 메일의 구체적인 내용, 즉 "=?gb18030?B?1vfM4g==?="와 같은 알 수 없는 것들이다.
 
3단계: 메일 객체에서 디코딩해야 할 내용을 추출합니다.
        subject = mail.get("subject")
사실mail은 기본적으로 사전 같은 물건이고,subject는 메일의 제목이며, 여기에는 제목을 예로 들 수 있습니다.여기서subject를 인쇄합니다. 결과는:=?gb18030?B?1vfM4g==?=
 
4단계: 추출된 subject를 디코딩합니다.
        dh = decode_header(subject)
이 단계는subject를 디코딩하는 것보다 초보적인 처리를 했고 인코딩 형식을 해석했다. dh를 출력하면 알 수 있다. 결과는 [(b'\xd6\xf7\xcc\xe2','gb18030')]이다. 목록에서 하나의 모듈임을 알 수 있다. 모듈의 첫 번째 항목은 우리의subject가 원래 가지고 있어야 할 내용이고 두 번째 항목은 인코딩 형식이다.
 
마지막 단계: 얻은 인코딩 형식에 따라 미리 처리된 내용을 디코딩하여 최종 결과를 얻습니다.
        result = dh[0][0].decode(dh[0][1])
이 때의result를 인쇄하면 원하는 결과를 얻을 수 있습니다: 테마
"=?gb18030?B?1vfM4g==?="에 대응하는 내용은'주제'라는 두 글자입니다.
하지만dh[0][1]가 None이라면 디코딩을 할 필요가 없다.
 
본고는 나처럼 반나절을 찾았지만 머리끝까지 메일 내용의 디코딩 문제를 해결하지 못하는 젊은이들을 도울 수 있기를 바란다.

좋은 웹페이지 즐겨찾기