python imaplib获取Gmail收件箱主题标题和发件人姓名

python imaplib获取Gmail收件箱主题标题和发件人姓名

问题描述:

我使用pythons imaplib连接到我的Gmail账户。我想检索前15个邮件(未读或未读,没关系),只显示主题和发件人姓名(或地址),但不知道如何显示收件箱的内容。python imaplib获取Gmail收件箱主题标题和发件人姓名

这里是我到目前为止的代码(连接成功)

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() 

我认为这应该是很简单的,我只是不熟悉不够用了imaplib库的命令。任何帮助,将必须感激...

UPDATE 感谢朱利安我可以通过每个消息循环,并取回全部内容:

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() 

,但我想只是主题和发件人。是否有这些项目的imaplib命令,或者我将不得不解析文本的全部内容[0] [1]:主题和发件人?

UPDATE OK,得到了主题和发件人部分工作,但迭代(1,15)由递减顺序进行显然我展示了最早的消息第一。我该如何改变这一点?我试着这样做:

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

但只是给了我None所有15次迭代...任何想法?我也试着mail.sort('REVERSE DATE', 'UTF-8', 'ALL')但Gmail的犯规支持的.sort()函数

UPDATE 想出一个办法做到这一点:

#....^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 

这给了我最近的15条消息,主题和发件人地址按要求在降序!感谢所有帮助!

+0

从Python文档的例子正常工作对我来说:http://docs.python.org/library/ imaplib#imap4 - example – Julian

+0

是的,你说得对,这对于检索所有消息的完整消息内容很安静。我只想要主题和发件人地址。然后,我可以使for循环只有1到15 – sadmicrowave

+0

另一个链接到Python文档:http://docs.python.org/library/email.html;) – Julian

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]) 

这应该给你一个关于如何检索主题和来自?

+2

什么是电子邮件?你是指我的'邮件'变量?什么是message_from_string()是由那个组成的?我收到一个错误,说明AttributeError(“未知的IMAP4命令:'%s'”%attr) AttributeError:未知的IMAP4命令:'message_from_string'' – sadmicrowave

+2

没想到,算出来了,我没有包含电子邮件模块。谢谢 – sadmicrowave

+0

添加到我的OP问题,帮助这部分,我会给你胜利! – sadmicrowave

对于那些寻找如何检查邮件和解析头,这是我用什么:

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:'模块'对象没有属性'message_from_string'。我正在导入电子邮件,承诺。 –

+1

@ChaseRoberts你需要使用'from email import email'。我假设你使用了'import email'这意味着你试图访问错误级别的'message_from_string'。 – blockloop

+0

Bwahaha,非常感谢。 –

我一直在寻找一个现成的简单的脚本来通过IMAP列出最后的收件箱,而无需通过所有邮件分拣。这里的信息是有用的,虽然DIY和错过了一些方面。首先,IMAP4.select返回消息计数。其次,主题头解码并不简单。

#! /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) 

这是我的解决方案,从电子邮件获取信息的有用位:

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