Estoy usando pitones imaplib para conectar a mi cuenta de gmail. Quiero recuperar el top 15 de los mensajes (leídos o leer, no importa) y mostrar sólo los temas y el nombre del remitente (o la dirección), pero no saben cómo mostrar el contenido de la bandeja de entrada.

Aquí está mi código hasta el momento (conexión correcta)

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

Creo que este debería ser bastante simple, es solo que no estoy lo suficientemente familiarizado con los comandos de la imaplib de la biblioteca. Cualquier ayuda sería muy apreciada…

ACTUALIZACIÓN
gracias a Julian me puede iterar a través de cada mensaje y recuperar todo el contenido con:

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

pero estoy queriendo solo el asunto y el remitente. Hay un imaplib comando para estos elementos o voy a tener que analizar el contenido completo de los datos[0][1] para el texto: Sujeto, y el Remitente?

ACTUALIZACIÓN
OK, tengo el sujeto y el emisor parte de trabajo, pero la iteración (1, 15) se realiza mediante la descripción de la orden al parecer me muestra los mensajes más antiguos primero. ¿Cómo puedo cambiar esto? He intentado hacer esto:

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

pero eso solo me da None para todos 15 repeticiones… alguna idea? También he intentado mail.sort('REVERSE DATE', 'UTF-8', 'ALL') pero gmail no soporte el .función sort ()

ACTUALIZACIÓN
Encontré una manera de hacerlo:

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

esto me da la más reciente 15 en el asunto del mensaje y la dirección del remitente en decending orden solicitado! Gracias a todos los que ayudaron!

  • El ejemplo de Python docs funciona muy bien para mí: docs.python.org/library/imaplib#imap4-example
  • Sí, que está a la derecha, que hace un trabajo tranquilo, bien para recuperar el mensaje completo el contenido de todos los mensajes. Sólo me interesa el tema y la dirección del remitente, aunque. Entonces puedo hacer el bucle sólo del 1 al 15
  • Y otro enlace a la Python docs: docs.python.org/library/email.html 😉
InformationsquelleAutor sadmicrowave | 2011-09-06

4 Comentarios

  1. 14
        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])

    Esto debe darle una idea sobre cómo recuperar el tema y desde?

    • ¿qué es el correo electrónico? ¿se refiere a mi «correo» de la variable? y lo que es message_from_string() es la que se compone? Estoy recibiendo un mensaje de error indicando AttributeError("Unknown IMAP4 command: '%s'" % attr) AttributeError: Unknown IMAP4 command: 'message_from_string'
    • no importa, lo imaginé, yo no incluir el correo electrónico del módulo. gracias
    • Añadido a mi OP problema, ayudar con esta parte y me voy a dar el premio!
    • Sería el código no provocar una Excepción en el caso de que haya menos de 30 correos electrónicos? c.fetch() daría lugar a la excepción si el id de correo electrónico (str(i) en este caso) no existe.
    • Es coult, más probable es que usted acaba de llegar un mensaje desde el servidor indica que no es ninguna IDENTIFICACIÓN. Dependiendo de su biblioteca de la ofc.
    • He probado el código y lo hace en escritura elevar una excepción si el id de correo electrónico (primer argumento en c.fetch() función) llega a 0, una solución sencilla sería romper el bucle una vez que el id de correo electrónico llegue a 0. (id de correo electrónico no parece que empieza desde 0)
    • excepto mi código va de 1 -> 30? ¿Cómo podría incluso llegar a 0, está seguro de que se trató este código en particular? También que el correo de los proveedores que han intentado? Creo que 0 es, de hecho, un índice en el que algunos de los proveedores?
    • Opps, yo estaba usando el OP del código actualizado que de hecho la banda de rodadura en 0 porque de esta línea for i in range( latest_email_id, latest_email_id-15, -1), así que si latest_email_id está a menos de 15 el bucle se vaya hacia 0. Yo también tenía una mirada en el RFC para IMAP 4 y puedo confirmar que el correo electrónico, los números de secuencia de inicio de 1, no 0. (código fuente aquí)
    • me alegro de oír y buen saber. Sin embargo a partir de la experiencia de la RFC es más como una guía de la línea de una aplicación real. Hay un montón de «Debería…», y «podría..» en el RFC y los desarrolladores de ir un poco «meeeh, esto no es importante» cuando se producen las cosas. Pero nunca la menor, OP debe esforzarse para seguir el RFC de seguros, solo ten en cuenta que otros no 🙂
    • Digamos que tengo un correo electrónico y contiene varios archivos adjuntos, y quiero ver los nombres de los archivos adjuntos. Cómo puedo hacer que el uso de su fragmento de código?
    • No sé de la parte superior de mi cabeza. Utilice el código, y ver lo que otros propeties está en que subject, to, y from

  2. 5

    Para aquellos que buscan cómo comprobar el correo y analizar las cabeceras, esto es lo que he utilizado:

    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
    • AttributeError: ‘módulo’ el objeto no tiene ningún atributo ‘message_from_string’. Yo voy a importar el correo electrónico, la promesa.
    • usted necesidad de utilizar from email import email. Supongo que usted utiliza import email que significa que usted está tratando de acceder a message_from_string en un nivel equivocado.
    • Bwahaha, gracias.
  3. 5

    Esta fue mi solución para obtener la utilidad de los bits de información de los correos electrónicos:

    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
  4. 3

    Yo estaba buscando un script sencillo para la lista de las últimas bandeja de entrada a través de IMAP sin ordenar a través de todos los mensajes. Aquí la información es útil, a pesar de BRICOLAJE y se pierde en algunos aspectos. En primer lugar, IMAP4.seleccione devuelve el número de mensaje. Segundo, el tema de cabecera de la decodificación no es sencillo.

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

Dejar respuesta

Please enter your comment!
Please enter your name here