2014-09-16 8 views
3

저는 smtp에서 전자 메일 목록을 가져와 나중에 그와 관련된 작업을 수행하기 위해 Python imaplib 및 전자 메일 모듈을 사용하고 있습니다. 이것은 내가 이메일 잡고 디코딩하는 데 사용하고 코드 조각입니다 :모바일 장치에서 보낸 전자 메일은 이상하게도 전자 메일 라이브러리를 사용하여 디코딩되었습니다.

import imaplib 
import email 

# Connect to server 
box = imaplib.IMAP4(CSMTP_SERVER) 
box.login(CSMTP_USERNAME, CSMTP_PASSWORD) 

# List inbox 
box.select('INBOX') 

# Retrieve email list ID's matching search patterns 
# Return from search is this: 
# ('OK', ['1 2 3 4 5 6 7 8 9 10 11 12 13 14']) 
data = box.search(None, 'ALL')[1] 
for num in data[0].split(): 

# Retrieve message headers and body 
headers = email.message_from_string(box.fetch(num, '(RFC822)')[1][0][1]) 
body = headers.get_payload() 
if not isinstance(body, str): 
    body = headers.get_payload()[0].get_payload() 

print headers, body 

이 이메일은 핫메일 또는 Gmail하지만로부터 전송되는 매력처럼 작동을 할 때마다 이메일이 안드로이드 기본에서, 예를 들어, 전송 APP를 우편으로 보내면 다음과 같은 메시지가 표시됩니다.

=?utf-8?B?RndkOiBDYXBzaGFyZTogaW1wb3J0aW5nIGZyb20gUGhvdG9z? 
U2VudCBmcm9tIG15IEhUQwoKLS0tLS0gRm9yd2FyZGVkIG1lc3NhZ2UgLS0tLS0KRnJvbTogIkFs 
ZXhhbmRlciBBdnRhbnNraSIgPGFsZXhAYXZ0YW5za2kuY29tPgpUbzogIlBlam1hbiBNYWtoZmki 
IDxwakBtYWtoZmkuY29tPgpTdWJqZWN0OiBDYXBzaGFyZTogaW1wb3J0aW5nIGZyb20gUGhvdG9z 
CkRhdGU6IFdlZCwgU2VwIDEwLCAyMDE0IDk6MDYgUE0KCkhpIFBlam1hbiwKCkkgd2FzIHBsYXlp 
bmcgd2l0aCBDYXBzaGFyZSB0b2RheSBhbmQgZm91bmQgc29tZXRoaW5nIG1pc3NpbmcuIEkgZ3Vl 
c3MgeW91CmhhdmUgcGxhbnMgZm9yIGl0LCBidXQgaXQgZG9lc24ndCBodXJ0IHRvIG1lbnRpb24g 
aXQsIGp1c3Qgb24gY2FzZS4uLgoKV2hlbiBpbXBvcnRpbmcgcGhvdG9zLCBJIGhhdmUgdGhlIG9w 
dGlvbiB0byBlaXRoZXIgZ2V0IG9uZSBvZiB0aGUgaW1hZ2VzCnRoYXQgYXJlIGRvd25sb2FkZWQg 
b24gbXkgcGhvbmUsIG9yIHRvIHRha2UgYSBuZXcgcGljdHVyZS92aWRlby4gV2hhdCdzCm1pc3Np 
bmcgaXMgYWJpbGl0eSB0byBnZXQgcGhvdG9zIGZyb20gbXkwcyBJJ3ZlIHVzZWQgZG9uJ3Qg 
Y2FyZSB3aGVyZSB0aGUgcGhvdG8gaXMgbG9jYXRlZCBhbmQgYWxsCnBpY3R1cmVzIGFyZSBlcXVh 
bGx5IGFjY2Vzc2libGUgKG9yIG1heWJlIHRoaXMgYXBwbGllcyBvbmx5IHRvIEdvb2dsZQphcHBz 
PykuCgpOb3QgaW1wb3J0YW50LCBubyBpZGVhIGlmIGl0IGlzIGp1c3QgYSBsaW5lIG9yIHR3byBm 
aXggb3Igc29tZXRoaW5nIG1vcmUKY29tcGxpY2F0ZWQuCgpUYWtlIGNhcmUsCgotIEFsZXgsIGJl 
dGEgdGVzdGVyLCBRQSB2b2x1bnRlZXIsIGFuZCBzZW5pb3IgcGVza3kgc3RpY2tsZXI= 

휴대 전화에서 이메일을 보내고 있습니다. 나는 이것이 RFC822에 기반한 이메일의 헤더를 올바르게 짓지 않는 몇몇 emailers에 관한 것이지만, 어떻게 든이를 고치고 모든 이메일을 검색 할 수 있어야한다고 생각한다.

이 문제를 해결하는 방법에 대한 몇 가지 힌트를 보내 주시면 감사하겠습니다. 미리 감사드립니다.

+1

당신은'내용-Type'와'콘텐츠 전송-Encoding' 헤더를 확인해야한다 – goncalopp

+1

또한,이 [MIME임을 주목할 필요가 ] (https://en.wikipedia.org/wiki/MIME), 기본 rfc822에 지정되지 않았습니다. RFC 2045-2047 – goncalopp

+0

을 읽어야합니다. 그 헤더에 대해서는 몰랐습니다. 정보 주셔서 감사합니다! –

답변

2

입니다 - 그것은 오히려 2045-2047 새로운에서, RFC822에 지정된 아니에요.

현대 이메일의 대부분은 MIME을 어떤 방식 으로든 사용하므로 분명히 지원해야합니다.

이 메시지와 특히 관련이있는 것은 Encoded-Word을 지정하는 RFC2047입니다. good overview on wikipedia이 있으며 부분적으로 필기합니다 :

형식은 "=? charset? encoding? encoded text? ="입니다.

인코딩은 quoted-printable 인코딩과 유사한 Q 인코딩을 나타내는 "Q"또는 base64 인코딩을 나타내는 "B"중 하나 일 수 있습니다.

그래서,이 특정 메시지에 대해, 당신은 Base64로 인코딩 (B) utf-8 인코딩 된 텍스트가 있습니다. 실제 메시지는 B? 바로 뒤에 시작하고 은 두 번째 줄에 있지 않습니다.. 여기

는이 모든 것을 처리 할 수있는 몇 가지 간단한 파이썬 코드입니다 :

if body.startswith("=?"): 
    i1= body.index("?") 
    i2= body.index("?", i1+1) 
    i3= i2+2 
    encoding= body[i1+1:i2] 
    assert body[i2:i3]=="?B" #don't handle Q format, it's not commonly used 
    body= base64.b64decode(body[i3+1:]).decode(encoding) 
+0

고마워요. 매우 유용했습니다. 아쉽게도 MIME을 검사하고 ur python 코드를 몇 가지 테스트와 병합하십시오. –

1

이상한 인코딩이가 MIME 메시지입니다 base64로

>>> import base64 
>>> base64.decodestring('RndkOiBDYXBzaGFyZTogaW1wb3J0aW5nIGZyb20gUGhvdG9z?').decode('utf8') 
u'Fwd: Capshare: importing from Photos' 
>>> base64.decodestring('''U2VudCBmcm9tIG15IEhUQwoKLS0tLS0gRm9yd2FyZGVkIG1lc3NhZ2UgLS0tLS0KRnJvbTogIkFs 
... ZXhhbmRlciBBdnRhbnNraSIgPGFsZXhAYXZ0YW5za2kuY29tPgpUbzogIlBlam1hbiBNYWtoZmki 
... IDxwakBtYWtoZmkuY29tPgpTdWJqZWN0OiBDYXBzaGFyZTogaW1wb3J0aW5nIGZyb20gUGhvdG9z 
... CkRhdGU6IFdlZCwgU2VwIDEwLCAyMDE0IDk6MDYgUE0KCkhpIFBlam1hbiwKCkkgd2FzIHBsYXlp 
... bmcgd2l0aCBDYXBzaGFyZSB0b2RheSBhbmQgZm91bmQgc29tZXRoaW5nIG1pc3NpbmcuIEkgZ3Vl 
... c3MgeW91CmhhdmUgcGxhbnMgZm9yIGl0LCBidXQgaXQgZG9lc24ndCBodXJ0IHRvIG1lbnRpb24g 
... aXQsIGp1c3Qgb24gY2FzZS4uLgoKV2hlbiBpbXBvcnRpbmcgcGhvdG9zLCBJIGhhdmUgdGhlIG9w 
... dGlvbiB0byBlaXRoZXIgZ2V0IG9uZSBvZiB0aGUgaW1hZ2VzCnRoYXQgYXJlIGRvd25sb2FkZWQg 
... b24gbXkgcGhvbmUsIG9yIHRvIHRha2UgYSBuZXcgcGljdHVyZS92aWRlby4gV2hhdCdzCm1pc3Np 
... bmcgaXMgYWJpbGl0eSB0byBnZXQgcGhvdG9zIGZyb20gbXkgYWxidW1zIG9yIGJhY2tlZC11cCBw 
... aG90b3MgdGhhdAphcmUgbm90IHBoeXNpY2FsbHkgc3RvcmVkIG9uIHRoZSBkZXZpY2UgLSBmb3Ig 
... ZXhhbXBsZSB0aG9zZSBvbiBHb29nbGUKZHJpdmUuIE1vcbmQgYWxsCnBpY3R1cmVzIGFyZSBlcXVh 
... bGx5IGFjY2Vzc2libGUgKG9yIG1heWJlIHRoaXMgYXBwbGllcyBvbmx5IHRvIEdvb2dsZQphcHBz 
... PykuCgpOb3QgaW1wb3J0YW50LCBubyBpZGVhIGlmIGl0IGlzIGp1c3QgYSBsaW5lIG9yIHR3byBm 
... aXggb3Igc29tZXRoaW5nIG1vcmUKY29tcGxpY2F0ZWQuCgpUYWtlIGNhcmUsCgotIEFsZXgsIGJl 
... dGEgdGVzdGVyLCBRQSB2b2x1bnRlZXIsIGFuZCBzZW5pb3IgcGVza3kgc3RpY2tsZXI=''').decode('utf8') 
u'Sent from my HTC\n\n----- Forwarded message -----\n.... 
+1

도'decode ('utf-8')'할 가치가 있습니다. – goncalopp

+0

나는 base64를 보았습니다. 그것을 테스트하고 전에 제안 된 MIME 유형을 확인하십시오. 답변 해주셔서 감사합니다! –