2011-02-05 7 views
6

python을 사용하여 이메일을 수신하고 싶습니다. 지금까지 나는 시체가 아니라 대상을 얻을 수있었습니다. 여기에 사용 된 코드는 다음과 같습니다python을 사용하여 메일을받는 방법

import poplib 
from email import parser 
pop_conn = poplib.POP3_SSL('pop.gmail.com') 
pop_conn.user('myusername') 
pop_conn.pass_('mypassword') 
#Get messages from server: 
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
# Concat message pieces: 
messages = ["\n".join(mssg[1]) for mssg in messages] 
#Parse message intom an email object: 
messages = [parser.Parser().parsestr(mssg) for mssg in messages] 
for message in messages: 
    print message['subject'] 
    print message['body'] 
pop_conn.quit() 

내 문제는 내가이 코드를 실행하면 제대로 몸 제목이 아닌를 반환합니다. 따라서 "Tester"라는 제목의 이메일과 "This is a test message"라는 메일을 보내면 IDLE처럼 보입니다.

>>>>Tester >>>>None 

그래서 피사체가 아니라 몸을 평가 정확하게 것으로 보인다, 나는 그것을 구문 분석 방법의 오른쪽 생각? 문제는 주제와 본문을 모두 반환하도록 라이브러리를 변경하는 방법을 파악하기에 충분하지 않다는 것입니다.

답변

5

당신이

print message.keys() 

를 실행하는지 당신이 원하는 것은 get_payload() 방법이다 겠지만 이메일 파서하는 body 키를 포함하지 않는 email.message.Message 객체를 반환

for message in messages: 
    print message['subject'] 
    print message.get_payload() 
pop_conn.quit() 

멀티 파트 메시지의 경우 복잡해집니다. get_payload()은 각각 Message 오브젝트 인 파트 목록을 리턴합니다. i 부분을 반환하는 get_payload(i)을 사용하여 멀티 파트 메시지의 특정 부분을 가져올 수 있으며 i이 범위를 벗어난 경우 IndexError을 발생 시키거나 메시지가 멀티 파트가 아닌 경우 TypeError을 발생시킵니다.

Gustavo Costa De Oliveir가 지적했듯이 walk() 메서드를 사용하여 순서대로 부품을 가져올 수 있습니다. 즉, 메시지의 부품 및 하위 부품을 깊이 우선 탐색합니다.

모듈에 대한 자세한 내용은 http://docs.python.org/library/email.message.html#email.message.Message입니다. 이메일의 부품을 통해 깊이 우선

for part in message.walk(): 
    if part.get_content_type(): 
     body = part.get_payload(decode=True) 

walk() 기능의 반복을, 그리고 당신을 찾고 있습니다 :

8

객체 메시지 본문이없는,이처럼 여러 부분을 분석해야합니다 콘텐츠 유형이있는 부품의 경우 콘텐츠 형식은 text/plain 또는 text/html 일 수 있으며 메시지가 content_typemultipart/alternative으로 설정된 경우 하나의 전자 메일에 둘 다 포함될 수 있습니다. 유 IMAP4를 사용하려면

2

는 또한 메시지의 올바른 인코딩에서 좋은 반환 데이터는 일부 다국어 내용을

 

charset = part.get_content_charset() 
content = part.get_payload(decode=True) 
content = content.decode(charset).encode('utf-8') 
 
0

가 포함되어 있습니다. 전망 파이썬 라이브러리를 사용하여, 여기에서 다운로드 :

print mail.mailbody() 
print mail.mailsubject() 
print mail.mailfrom() 
print mail.mailto() 
:

import outlook 
mail = outlook.Outlook() 
mail.login('[email protected]','yourpassword') 
mail.inbox() 
print mail.unread() 

이메일 요소를 가져 오지하기 : https://github.com/awangga/outlook 받은 편지함에서 읽지 않은 메일을 검색 할 수

관련 문제