2012-12-25 12 views
8

I read this already und schrieb dieses Skript, um Körper für E-Mails in einigen Mail-Box, die Titel beginnt mit "$" und wird von einigen Absender gesendet.Python imaplib holen Körper E-Mails Gmail

import email, getpass, imaplib, os 

detach_dir = "F:\PYTHONPROJECTS" # where you will save attachments 
user = raw_input("Enter your GMail username --> ") 
pwd = getpass.getpass("Enter your password --> ") 

# connect to the gmail imap server 
m = imaplib.IMAP4_SSL("imap.gmail.com") 
m.login(user, pwd) 

m.select("PETROLEUM") # here you a can choose a mail box like INBOX instead 
# use m.list() to get all the mailboxes 

resp, items = m.search(None, '(FROM "[email protected]")') 
items = items[0].split() # getting the mails id 

my_msg = [] # store relevant msgs here in please 
msg_cnt = 0 
break_ = False 
for emailid in items[::-1]: 
    resp, data = m.fetch(emailid, "(RFC822)") 
    if (break_): 
     break 
    for response_part in data: 
     if isinstance(response_part, tuple): 
      msg = email.message_from_string(response_part[1]) 
      varSubject = msg['subject'] 
      if varSubject[0] == '$': 
       msg_cnt += 1 
       my_msg.append(msg) 
       print msg_cnt 
       print email.message_from_string(response_part[1]) 
       if (msg_cnt == 5): 
        break_ = True 

wenn ich email.message_from_string(response_part[1]) drucken, kann ich sehen, es erste Informationen enthält (Header, von, bis, Datum ...), die der Volltextkörper. Aber ich kann den Körper nicht selbst holen. email.message_from_string(response_part[0]) druckt Mails IDS, und email.message_from_string(response_part[2]) ist außerhalb des Bereichs. email.message_from_string(response_part[1][0]) tut es nicht.

Dank und Grüße. Jetzt

UPDATE

, kann ich fast Text haben. Es wird jedoch immer noch durch eine Informationsmeldung verdorben, die zuerst kommt. Ich bekomme als Ergebnis

From nobody Tue Dec 25 11:42:58 2012 

US=3D$4.030 

EastCst=3D$4.036 

NewEng=3D$4.205 

CenAtl=3D$4.149 

LwrAtl=3D$3.921 

Midwst=3D$3.984 

GulfCst=3D$3.945 

RkyMt=3D$4.195 

WCst=3D$4.187 

CA=3D$4.268 

und ich möchte von From nobody Tue Dec 25 11:42:58 2012 loszuwerden, die Informationen sind. Ich weiß, dass ich Text analysieren könnte, suche nach der ersten relevanten Zeile ... ich weiß.

Der Code für das Erreichen so (in meiner ersten Probe-Stecker) ist

if varSubject[0] == '$': 
     r, d = m.fetch(emailid, "(UID BODY[TEXT])") 
     msg_cnt += 1 
     my_msg.append(msg) 
     print email.message_from_string(d[0][1]) 

Haben Sie eine bessere Art und Weise haben (kein string) ??? Mehr: Was ist der Befehl, um das Datum jetzt zu holen? Ich weiß, dass ich varDate = msg['date'] wo oben geeignet tun kann, aber wie Tag-Monat-Jahr nur abrufen? DANK

Antwort

4

Ich habe es geschafft, zu tun bekommen zu arbeiten, es extrahiert die Nutzbits und Ausgänge sie zu Textdateien:

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