2011-09-06 18 views
17

私はGmailのアカウントに接続するためにpythons imaplibを使用しています。私は上位15のメッセージ(未読または読んで、それは問題ではありません)を取り出し、件名と送信者の名前(またはアドレス)を表示したいだけですが、受信ボックスの内容を表示する方法はわかりません。ここでGmailの受信トレイの件名と送信者の名前を取得するためのpython imaplib

は私のコードは、これまでに(正常に接続)

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コマンドがありますか、またはテキストのSubject:とSender?という内容についてdata [0] [1]の内容全体を解析する必要がありますか?

UPDATE OKは、作業対象と差出人の部分が、どうやら最初に私の最も古いメッセージを示す降順順序によって行われる反復(1、15)を得ました。これをどうやって変更できますか? ...任意のアイデアを

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

それはちょうど私の全15回の反復のためのNoneを与える:私はこれをやってみましたか?私もmail.sort('REVERSE DATE', 'UTF-8', 'ALL')を試みたが、.sort()関数をサポートしてdoesntのGmailの

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

は私のために正常に動作します:http://docs.python.org/library/ imaplib#imap4-example – Julian

+0

はい、そうです。すべてのメッセージの完全なメッセージ内容を取得するために静かに動作します。私はちょうど被験者と送信者のアドレスが必要です。私は、ちょうど1 15 – sadmicrowave

+0

をループし、Pythonドキュメントへの別のリンクのために作ることができます。http://docs.python.org/library/email.html;) – Julian

答えて

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

これで、件名の取得方法とその取得方法を知ることができます。メールをチェックし、ヘッダーを解析する方法をお探しの方に

+2

メールが何でありますか?あなたは私の 'メール'変数を参照していますか? message_from_string()とは何ですか? 'AttributeError("不明なIMAP4コマンド: '%s' "%attr) AttributeError:不明なIMAP4コマンド: 'message_from_string'' – sadmicrowave

+2

私は電子メールモジュールを含んでいませんでした。おかげで – sadmicrowave

+0

私のOPの問題に追加され、この部分を手伝って、私はあなたに勝つよ! – sadmicrowave

4

、これは私が使用したものである:

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'オブジェクトに 'message_from_string'属性がありません。私は電子メールを約束しています。 –

+1

@ChaseRobertsあなたは 'from email import email'を使う必要があります。 'import email'を使ったとします。つまり、間違ったレベルで' message_from_string'にアクセスしようとしています。 – blockloop

+0

Bwahaha、ありがとうございました。 –

3

私はすべてのメッセージを分類することなく、IMAP経由で最後の受信トレイをリストアップする準備ができて簡単なスクリプトを探していました。ここの情報は便利ですが、DIYやいくつかの面を見逃しています。まず、IMAP4.selectはメッセージ数を返します。第2に、主題の復号化は簡単ではない。

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

これは、電子メールからの情報の有効ビットを取得するために私の解決策だった:Pythonのドキュメントから例

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 
関連する問題