2011-07-07 31 views
12

¿Alguien me puede ayudar a personalizar una muestra de código existente?Descargue un correo electrónico específico de Gmail usando Python

Puedo ver en el siguiente artículo cómo me puedo conectar a Gmail y descargar contenido, pero no puedo encontrar la manera de buscar un correo electrónico específico y solo descargar la marca de tiempo y el cuerpo?

ARTÍCULO: How can I download all emails with attachments from Gmail?

Específicamente quiero agarrar los correos electrónicos de "[email protected]" durante los últimos 5 días y descargar el tiempo de envío y el cuerpo de los mensajes de correo electrónico. Luego analizaré esto para determinar qué correos electrónicos necesito usar.

Soy autodidacta y estoy teniendo dificultades para personalizar el script anterior para hacer esto.

Cualquier ayuda es muy apreciada. Gracias.

JD

+0

¿Qué criterios de búsqueda [] (http://www.example-code.com/csharp/imap-search-critera.asp) han intentado hasta ahora? – sarnold

+1

No está relacionado con Gmail, pero apuesto IMAP/POP, por lo que debes buscarlo, excepto que eres autodirigido y lo estás haciendo con webclient; p – tmg

Respuesta

15

sugiere emplear IMAPClient como sí los documentos de más de muchos de los aspectos más esotéricos de IMAP.

El siguiente fragmento tirará de mensajes en función de sus criterios, analizar las cadenas de mensajes para email.message.Message casos e imprimir los Date y From cabeceras.

from datetime import datetime, timedelta 
import email 
from imapclient import IMAPClient 

HOST = 'imap.gmail.com' 
USERNAME = 'username' 
PASSWORD = 'password' 
ssl = True 

today = datetime.today() 
cutoff = today - timedelta(days=5) 

## Connect, login and select the INBOX 
server = IMAPClient(HOST, use_uid=True, ssl=ssl) 
server.login(USERNAME, PASSWORD) 
select_info = server.select_folder('INBOX') 

## Search for relevant messages 
## see http://tools.ietf.org/html/rfc3501#section-6.4.5 
messages = server.search(
    ['FROM "[email protected]"', 'SINCE %s' % cutoff.strftime('%d-%b-%Y')]) 
response = server.fetch(messages, ['RFC822']) 

for msgid, data in response.iteritems(): 
    msg_string = data['RFC822'] 
    msg = email.message_from_string(msg_string) 
    print 'ID %d: From: %s Date: %s' % (msgid, msg['From'], msg['date']) 
+0

Gracias Rob! Acabo de portar esto de Python2.6 a 2.7 y ahora recibo el siguiente error al llamar a message_from_string ... 'UnicodeEncodeError: el códec ascii no puede codificar el carácter u' \ xa0 'en la posición 3041: ordinal no está dentro del rango (128) '. ¿Debo realizar algún tipo de transformación en msg_String? Y estoy leyendo en el mismo correo electrónico, por lo que la carga útil del correo electrónico no puede ser el problema. – jond

+0

¿Ha actualizado IMAPClient a 0.10 o superior? El comportamiento cambió en esa versión; Las funciones ahora devuelven objetos Unicode (consulte https://bitbucket.org/mjs0/imapclient/src/tip/NEWS.rst). El problema particular en este caso es un espacio sin interrupciones. Puedes eliminarlo de forma segura (probablemente) con .replace (u '\ xa0', u '') –

+0

Gracias Rob !! Eso hizo el truco. – jond

2
import imaplib 
from datetime import datetime, timedelta 

obj = imaplib.IMAP4_SSL('imap.gmail.com',993) 
obj.login('username','password') 
obj.select() 

today = datetime.today() 
cutoff = today - timedelta(days=5) 
dt = cutoff.strftime('%d-%b-%Y') 
typ, data = obj.search(None, '(SINCE %s) (FROM "[email protected]")'%(dt,)) 
print data 
Cuestiones relacionadas