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
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 đỡ.
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.
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.
+1 cảm ơn về con trỏ. Tôi sẽ nghiên cứu thêm về điều đó. – Viet