2010-02-20 12 views
7

Tôi đang phát bằng Python imaplib (Python 2.6) để tìm nạp email từ Gmail. Mọi thứ tôi tìm nạp một email với phương thức http://docs.python.org/library/imaplib.html#imaplib.IMAP4.fetch Tôi nhận được toàn bộ email. Tôi chỉ cần phần văn bản và cũng phân tích các tên tệp đính kèm mà không cần tải chúng xuống. Làm thế nào điều này có thể được thực hiện? Tôi thấy rằng các email được GMail trả lại tuân theo cùng định dạng mà trình duyệt gửi tới máy chủ HTTP.Cách phân tích cú pháp email hiệu quả mà không cần chạm vào tệp đính kèm bằng cách sử dụng Python

Trả lời

0

Tôi e rằng bạn không may mắn. Theo this post, chỉ có hai phần của email - tiêu đề và nội dung. Cơ thể là nơi các tập tin đính kèm là nếu có bất kỳ và bạn phải tải về toàn bộ cơ thể trước khi giải nén chỉ văn bản tin nhắn. Thông tin về lệnh FETCH được tìm thấy here cũng hỗ trợ ý kiến ​​này. Trong khi nó nói rằng bạn có thể trích xuất partials của cơ thể, chúng được quy định trong điều khoản của octets mà không thực sự giúp đỡ.

+0

+1 cảm ơn về con trỏ. Tôi sẽ nghiên cứu thêm về điều đó. – Viet

5

Hãy nhìn vào công thức này: http://code.activestate.com/recipes/498189/

tôi thích nó một chút để in Từ, Chủ đề, ngày, tên của file đính kèm, và nội dung thư (chỉ rõ cho bây giờ - tầm thường để thêm thông điệp html của nó) .

Tôi đã sử dụng máy chủ Gmail pop3 trong trường hợp này, nhưng cũng sẽ hoạt động với IMAP.

import poplib, email, string 

mailserver = poplib.POP3_SSL('pop.gmail.com') 
mailserver.user('recent:YOURUSERNAME') #use 'recent mode' 
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext! 

numMessages = len(mailserver.list()[1]) 
for i in reversed(range(numMessages)): 
    message = "" 
    msg = mailserver.retr(i+1) 
    str = string.join(msg[1], "\n") 
    mail = email.message_from_string(str) 

    message += "From: " + mail["From"] + "\n" 
    message += "Subject: " + mail["Subject"] + "\n" 
    message += "Date: " + mail["Date"] + "\n" 

    for part in mail.walk(): 
     if part.is_multipart(): 
      continue 
     if part.get_content_type() == 'text/plain': 
      body = "\n" + part.get_payload() + "\n" 
     dtypes = part.get_params(None, 'Content-Disposition') 
     if not dtypes: 
      if part.get_content_type() == 'text/plain': 
       continue 
      ctypes = part.get_params() 
      if not ctypes: 
       continue 
      for key,val in ctypes: 
       if key.lower() == 'name': 
        message += "Attachment:" + val + "\n" 
        break 
      else: 
       continue 
     else: 
      attachment,filename = None,None 
      for key,val in dtypes: 
       key = key.lower() 
       if key == 'filename': 
        filename = val 
       if key == 'attachment': 
        attachment = 1 
      if not attachment: 
       continue 
      message += "Attachment:" + filename + "\n" 
     if body: 
      message += body + "\n" 
    print message 
    print 

Điều này sẽ đủ để bạn đi đúng hướng.

+0

+1 cảm ơn! thật tuyệt khi thấy mã mẫu! – Viet

+1

['poplib.retr()'] (http://docs.python.org/library/poplib.html#poplib.POP3.retr) tải xuống toàn bộ thư. – Harvey

2

Bạn có thể nhận được chỉ là văn bản đơn giản của email bằng cách làm một cái gì đó như:

connection.fetch(id, '(BODY[1])') 

Đối với các thông điệp gmail Tôi đã nhìn thấy, phần 1 có chữ thô, bao gồm rác nhiều phần dữ liệu. Điều này có thể không quá mạnh mẽ.

Tôi không biết cách lấy tên của tệp đính kèm mà không có tất cả. Tôi đã không thử sử dụng partials.

Các vấn đề liên quan