2011-02-05 44 views
6

Tôi muốn nhận email bằng python. Cho đến nay tôi đã có thể nhận được chủ đề nhưng không thể là cơ thể. Đây là mã tôi đang sử dụng:Cách nhận thư bằng 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() 

Vấn đề của tôi là khi tôi chạy mã này, nó trả về đúng đối tượng chứ không phải nội dung. Vì vậy, nếu tôi gửi một email với chủ đề "Tester" và nội dung "Đây là một tin nhắn thử nghiệm", nó trông giống như thế này trong IDLE.

>>>>Tester >>>>None 

Vì vậy, dường như nó đang đánh giá chính xác đối tượng chứ không phải nội dung, tôi nghĩ nó nằm trong phương pháp phân tích cú pháp đúng không? Vấn đề là tôi không biết đủ về các thư viện này để tìm ra cách thay đổi nó để nó trả về cả chủ thể lẫn thân thể.

Trả lời

5

Các phân tích cú pháp email trả về một đối tượng email.message.Message, mà không chứa một chìa khóa body, như bạn sẽ thấy nếu bạn chạy

print message.keys() 

Những gì bạn muốn là get_payload() phương pháp:

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

Nhưng điều này trở nên phức tạp khi nói đến thông điệp nhiều phần; get_payload() trả về một danh sách các phần, mỗi phần là một đối tượng Message. Bạn có thể nhận được một phần cụ thể của thông điệp nhiều phần bằng cách sử dụng get_payload(i), trả về phần i, tăng IndexError nếu i nằm ngoài phạm vi hoặc tăng TypeError nếu thư không phải là bội số.

Như Gustavo Costa De Oliveir chỉ ra, bạn có thể sử dụng phương pháp walk() để nhận các bộ phận theo thứ tự - nó thực hiện thao tác vượt qua chiều sâu đầu tiên của các phần và phần phụ của thông báo.

Có thêm thông tin về mô-đun email.parser tại http://docs.python.org/library/email.message.html#email.message.Message.

8

Thông điệp đối tượng không có một cơ thể, bạn sẽ cần phải phân tích nhiều phần, như thế này:

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

Các walk() lặp chức năng sâu-đầu tiên thông qua các bộ phận của email, và bạn đang tìm kiếm cho các phần có loại nội dung. Các loại nội dung có thể là text/plain hoặc text/html và đôi khi một e-mail có thể chứa cả hai (nếu thư content_type được đặt thành multipart/alternative).

2

nó cũng dữ liệu lợi nhuận cao trong bảng mã đúng trong thông điệp có chứa một số nội dung đa ngôn ngữ

 

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

nếu u muốn sử dụng IMAP4. Sử dụng thư viện python outlook, tải về tại đây: https://github.com/awangga/outlook để lấy email chưa đọc trong hộp thư đến của bạn:

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

để retrive yếu tố email:

print mail.mailbody() 
print mail.mailsubject() 
print mail.mailfrom() 
print mail.mailto() 
Các vấn đề liên quan