2011-09-06 36 views
17

Tôi đang sử dụng pyhtons imaplib để kết nối với tài khoản gmail của mình. Tôi muốn lấy 15 tin nhắn hàng đầu (chưa đọc hoặc đọc, không quan trọng) và chỉ hiển thị chủ đề và tên người gửi (hoặc địa chỉ) nhưng không biết cách hiển thị nội dung của hộp thư đến.python imaplib để lấy tiêu đề đối tượng trong hộp thư đến gmail và tên người gửi

Đây là mã của tôi cho đến nay (kết nối thành công)

import imaplib 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login('[email protected]', 'somecrazypassword') 
mail.list() 
mail.select('inbox') 

#need to add some stuff in here 

mail.logout() 

Tôi tin rằng điều này là đủ đơn giản, tôi chỉ là không đủ quen thuộc với các lệnh cho các thư viện imaplib. Bất kỳ trợ giúp sẽ được đánh giá cao phải ...

CẬP NHẬT nhờ Julian tôi có thể lặp qua từng tin nhắn và lấy lại toàn bộ nội dung với:

typ, data = mail.search(None, 'ALL') 
for num in data[0].split(): 
    typ, data = mail.fetch(num, '(RFC822)') 
    print 'Message %s\n%s\n' % (num, data[0][1]) 
mail.close() 

nhưng tôi muốn chỉ là chủ thể và người gửi. Có lệnh imaplib cho các mục này hay tôi sẽ phải phân tích toàn bộ nội dung của dữ liệu [0] [1] cho văn bản: Chủ đề và Người gửi?

CẬP NHẬT OK, để chủ thể và phần người gửi hoạt động nhưng việc lặp lại (1, 15) được thực hiện theo thứ tự hiển thị rõ ràng cho tôi thấy thư cũ nhất trước. Làm thế nào tôi có thể thay đổi điều này? Tôi đã cố gắng làm điều này:

for i in range(len(data[0])-15, len(data[0])): 
    print data 

nhưng điều đó chỉ mang lại cho tôi None cho tất cả 15 lần lặp ... bất kỳ ý tưởng? Tôi cũng đã cố gắng mail.sort('REVERSE DATE', 'UTF-8', 'ALL') nhưng gmail doesnt hỗ trợ .sort() chức năng

CẬP NHẬT đặn ra một cách để làm điều đó:

#....^other code is the same as above except need to import email module 
mail.select('inbox') 
typ, data = mail.search(None, 'ALL') 
ids = data[0] 
id_list = ids.split() 
#get the most recent email id 
latest_email_id = int(id_list[-1]) 

#iterate through 15 messages in decending order starting with latest_email_id 
#the '-1' dictates reverse looping order 
for i in range(latest_email_id, latest_email_id-15, -1): 
    typ, data = mail.fetch(i, '(RFC822)') 

    for response_part in data: 
     if isinstance(response_part, tuple): 
      msg = email.message_from_string(response_part[1]) 
      varSubject = msg['subject'] 
      varFrom = msg['from'] 

    #remove the brackets around the sender email address 
    varFrom = varFrom.replace('<', '') 
    varFrom = varFrom.replace('>', '') 

    #add ellipsis (...) if subject length is greater than 35 characters 
    if len(varSubject) > 35: 
     varSubject = varSubject[0:32] + '...' 

    print '[' + varFrom.split()[-1] + '] ' + varSubject 

này mang lại cho tôi là chủ đề 15 most recent message và người gửi địa chỉ trong thứ tự quyết định theo yêu cầu! Cảm ơn tất cả những người đã giúp!

+0

Các ví dụ từ các tài liệu Python hoạt động tốt đối với tôi: http://docs.python.org/library/ imaplib # imap4-example – Julian

+0

Có, bạn nói đúng, điều đó hoạt động rất tốt để truy xuất toàn bộ nội dung tin nhắn của tất cả các tin nhắn. Tôi chỉ muốn chủ đề và địa chỉ người gửi mặc dù. Sau đó tôi có thể tạo vòng lặp for chỉ từ 1 đến 15 – sadmicrowave

+0

Và một liên kết khác đến tài liệu Python: http://docs.python.org/library/email.html;) – Julian

Trả lời

12
c.select('INBOX', readonly=True) 

    for i in range(1, 30): 
     typ, msg_data = c.fetch(str(i), '(RFC822)') 
     for response_part in msg_data: 
      if isinstance(response_part, tuple): 
       msg = email.message_from_string(response_part[1]) 
       for header in [ 'subject', 'to', 'from' ]: 
        print '%-8s: %s' % (header.upper(), msg[header]) 

Điều này sẽ cho bạn ý tưởng về cách truy xuất chủ đề và từ đó?

+2

email là gì?bạn đang đề cập đến biến 'thư' của tôi? và message_from_string() là gì được tạo nên? Tôi nhận được một lỗi nói rõ 'AttributeError (" Unknown IMAP4 lệnh: '% s' "% attr) AttributeError: Unknown IMAP4 lệnh: 'message_from_string'' – sadmicrowave

+2

nevermind, figured it out, tôi không bao gồm các mô-đun email. cảm ơn – sadmicrowave

+0

Đã thêm vào sự cố OP của tôi, hãy trợ giúp phần này và tôi sẽ cung cấp cho bạn chiến thắng! – sadmicrowave

4

Đối với những người tìm kiếm cách kiểm tra mail và phân tích các tiêu đề, đây là những gì tôi đã sử dụng:

def parse_header(str_after, checkli_name, mailbox) : 
    #typ, data = m.search(None,'SENTON', str_after) 
    print mailbox 
    m.SELECT(mailbox) 
    date = (datetime.date.today() - datetime.timedelta(1)).strftime("%d-%b-%Y") 
    #date = (datetime.date.today().strftime("%d-%b-%Y")) 
    #date = "23-Jul-2012" 

    print date 
    result, data = m.uid('search', None, '(SENTON %s)' % date) 
    print data 

    doneli = [] 
    for latest_email_uid in data[0].split(): 
     print latest_email_uid 
     result, data = m.uid('fetch', latest_email_uid, '(RFC822)') 
     raw_email = data[0][1] 

     import email 
     email_message = email.message_from_string(raw_email) 
     print email_message['To'] 
     print email_message['Subject'] 
     print email.utils.parseaddr(email_message['From']) 
     print email_message.items() # print all headers 
+0

AttributeError: 'module' đối tượng không có thuộc tính 'message_from_string'. Tôi đang nhập email, lời hứa. –

+1

@ChaseRoberts bạn cần sử dụng 'từ email nhập email '. Tôi đoán bạn đã sử dụng 'email nhập 'có nghĩa là bạn đang cố gắng truy cập' message_from_string' ở cấp sai. – blockloop

+0

Bwahaha, cảm ơn nhiều. –

3

tôi đang tìm kiếm một kịch bản đơn giản được thực hiện sẵn sàng vào danh sách hộp thư cuối cùng qua IMAP mà không sắp xếp thông qua tất cả các thư . Thông tin ở đây rất hữu ích, mặc dù DIY và bỏ sót một số khía cạnh. Đầu tiên, IMAP4.select trả về số lượng tin nhắn. Thứ hai, giải mã tiêu đề chủ đề không đơn giản.

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 


import imaplib 
import email 
from email.header import decode_header 
import HTMLParser 


# to unescape xml entities 
_parser = HTMLParser.HTMLParser() 

def decodeHeader(value): 
    if value.startswith('"=?'): 
    value = value.replace('"', '') 

    value, encoding = decode_header(value)[0] 
    if encoding: 
    value = value.decode(encoding) 

    return _parser.unescape(value) 

def listLastInbox(top = 4): 
    mailbox = imaplib.IMAP4_SSL('imap.gmail.com') 
    mailbox.login('[email protected]', 'somecrazypassword') 

    selected = mailbox.select('INBOX') 
    assert selected[0] == 'OK' 
    messageCount = int(selected[1][0]) 

    for i in range(messageCount, messageCount - top, -1): 
    reponse = mailbox.fetch(str(i), '(RFC822)')[1] 
    for part in reponse: 
     if isinstance(part, tuple): 
     message = email.message_from_string(part[1]) 
     yield {h: decodeHeader(message[h]) for h in ('subject', 'from', 'date')} 

    mailbox.logout() 


if __name__ == '__main__': 
    for message in listLastInbox(): 
    print '-' * 40 
    for h, v in message.items(): 
     print u'{0:8s}: {1}'.format(h.upper(), v) 
2

Đây là giải pháp của tôi để có được các bit thông tin hữu ích từ email:

import datetime 
import email 
import imaplib 
import mailbox 


EMAIL_ACCOUNT = "[email protected]" 
PASSWORD = "your password" 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login(EMAIL_ACCOUNT, PASSWORD) 
mail.list() 
mail.select('inbox') 
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN) 
i = len(data[0].split()) 

for x in range(i): 
    latest_email_uid = data[0].split()[x] 
    result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)') 
    # result, email_data = conn.store(num,'-FLAGS','\\Seen') 
    # this might work to set flag to seen, if it doesn't already 
    raw_email = email_data[0][1] 
    raw_email_string = raw_email.decode('utf-8') 
    email_message = email.message_from_string(raw_email_string) 

    # Header Details 
    date_tuple = email.utils.parsedate_tz(email_message['Date']) 
    if date_tuple: 
     local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple)) 
     local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S"))) 
    email_from = str(email.header.make_header(email.header.decode_header(email_message['From']))) 
    email_to = str(email.header.make_header(email.header.decode_header(email_message['To']))) 
    subject = str(email.header.make_header(email.header.decode_header(email_message['Subject']))) 

    # Body details 
    for part in email_message.walk(): 
     if part.get_content_type() == "text/plain": 
      body = part.get_payload(decode=True) 
      file_name = "email_" + str(x) + ".txt" 
      output_file = open(file_name, 'w') 
      output_file.write("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\nBody: \n\n%s" %(email_from, email_to,local_message_date, subject, body.decode('utf-8'))) 
      output_file.close() 
     else: 
      continue 
Các vấn đề liên quan