2010-02-07 12 views
6

Sto provando a creare un programma Python che recuperi solo il testo del corpo di un'e-mail senza passare intestazioni o altri parametri. Non sono sicuro di come andare su questo.Python: recupero solo del testo di messaggio POP3, senza intestazioni

L'obiettivo è essere in grado di inviare comandi di base a un programma tramite messaggio di testo.

Quello che ho ora è questo:

import poplib 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     print j 

mail.quit() 
input("Press any key to continue.") 

che è tutto bene, tranne quando "J di stampa" viene eseguita la stampa l'intero messaggio, incluse le intestazioni. Voglio solo estrarre il testo del corpo senza ulteriori rifiuti.

Qualcuno può aiutare? Grazie!

+1

WOW! È tutto ciò che serve per scaricare la posta in Python? Ho provato a farlo in C# per mesi !!!! E non uno dei componenti di terze parti funziona in C#! ........ Non conosco Python, ma ricorda di aver visto lo stesso problema da qualche parte, sto cercando il sito web adesso e se riesco ancora a trovarlo , post malato che le persone risolvono qui per te ... se hanno trovato la soluzione –

+0

Python rende tutto come un compito banale;) – Ospho

risposta

2

È possibile analizzare le e-mail utilizzando email module.

+0

Grazie! Questo modulo è perfetto – mplewis

3

Questo è un frammento di codice dal mio lettore POP3:

 response, lines, bytes = pop.retr(m) 

     # remove trailing blank lines from message 
     while lines[-1]=="": 
      del lines[-1] 

     try: 
      endOfHeader = lines.index('') 
      header = lines[:endOfHeader] 
      body = lines[endOfHeader+1:] 
     except ValueError: 
      header = lines 
      body = [] 

Queste chiavi fuori la prima riga vuota nell'elenco di tutte le linee come la fine le informazioni di intestazione. Quindi basta elencare la slice da lì fino alla fine per il corpo del messaggio.

+0

Grazie per l'aiuto! Comunque ho qualche problema. Cosa rappresenta m in pop.retr (m)? Si tratta di errori di lancio e non so cosa mettere lì, o se questa routine deve risiedere in un sottotitolo specifico. – mplewis

+0

'pop.retr (m)' nel mio codice è analogo a 'mail.retr (i + 1)' nel tuo codice - m è il numero del messaggio ed è un numero intero. Vedi come ho decompresso la tupla restituita da retr, mentre prendi semplicemente l'elemento [1] th? Nel codice, basta scorrere le righe fino a quando non si preme una stringa vuota o si esauriscono le righe. Il resto è il corpo. – PaulMcG

5

userei e-mail il modulo per ottenere il corpo del messaggio di posta elettronica con get_payload() metodo che salta informazioni di intestazione.

ho aggiunto qualche riga al codice (sono contrassegnati con # new statement alla fine della linea)

import poplib 
import email # new statement 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     #print j 
     msg = email.message_from_string(j) # new statement 
     print(msg.get_payload()) # new statement 

mail.quit() 
input("Press any key to continue.") 
+0

viene visualizzato l'errore "TypeError: initial_value deve essere str o None, non byte" quando si tenta di utilizzare la riga msg = email.message_from_string (j) –

+0

@Tintinabulator Zea - Questo dovrebbe accadere perché si sta usando ** Python3 **. Usa 'msg = email.message_from_bytes (j)' invece di 'msg = email.message_from_string (j)'. Vedi anche [Python Email Parsing Issue] (https://stackoverflow.com/questions/19508393/python-email-parsing-issue/19508543). –

Problemi correlati