Obtención de los correos electrónicos más recientes usando IMAP y Python

Estoy buscando devolver los n (lo más probable 10) correos electrónicos más recientes de una bandeja de entrada de cuentas de correo electrónico utilizando IMAP.

Hasta ahora he hecho adoquines juntos:

import imaplib from email.parser import HeaderParser M = imaplib.IMAP4_SSL('my.server') user = 'username' password = 'password' M.login(user, password) M.search(None, 'ALL') for i in range (1,10): data = M.fetch(i, '(BODY[HEADER])') header_data = data[1][0][1] parser = HeaderParser() msg = parser.parsestr(header_data) print msg['subject'] 

Esto está devolviendo bien los encabezados de los correos electrónicos, pero parece ser una colección semi-aleatoria de correos electrónicos que recibe, no los 10 más recientes.

Si ayuda, me estoy conectando a un servidor de Exchange 2010. Otros enfoques también son bienvenidos, IMAP parecía el más apropiado dado que solo quería leer los correos electrónicos y no enviarlos.

El comando de clasificación está disponible, pero no se garantiza que sea compatible con el servidor IMAP. Por ejemplo, Gmail no admite el comando SORT.

Para probar el comando de ordenación, reemplazarías:
M.search(None, 'ALL')
con
M.sort(search_critera, 'UTF-8', 'ALL')

Entonces search_criteria sería una cadena como:

 search_criteria = 'DATE' #Ascending, most recent email last search_criteria = 'REVERSE DATE' #Descending, most recent email first search_criteria = '[REVERSE] sort-key' #format for sorting 

Según RFC5256, estas son sort-key válidas:
"ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" / "SUBJECT" / "TO"

Notas:
1. se requiere charset, intente con US-ASCII o UTF-8 no se requiere que todos los demás sean compatibles con el servidor IMAP
2. También se requiere buscar critera. El comando ALL es válido, pero hay muchos. Ver más en http://www.networksorcery.com/enp/rfc/rfc3501.txt

El mundo de IMAP es salvaje y loco. Buena suerte

esto es trabajo para mi ~

 import imaplib from email.parser import HeaderParser M = imaplib.IMAP4_SSL('my.server') user = 'username' password = 'password' M.login(user, password) (retcode, messages) =M.search(None, 'ALL') news_mail = get_mostnew_email(messages) for i in news_mail : data = M.fetch(i, '(BODY[HEADER])') header_data = data[1][0][1] parser = HeaderParser() msg = parser.parsestr(header_data) print msg['subject'] 

y esto es obtener la nueva función de correo electrónico:

 def get_mostnew_email(messages): """ Getting in most recent emails using IMAP and Python :param messages: :return: """ ids = messages[0] # data is a list. id_list = ids.split() # ids is a space separated string #latest_ten_email_id = id_list # get all latest_ten_email_id = id_list[-10:] # get the latest 10 keys = map(int, latest_ten_email_id) news_keys = sorted(keys, reverse=True) str_keys = [str(e) for e in news_keys] return str_keys 

Este es el código para obtener el correo electrónico de, correo electrónico tema, fecha de correo electrónico, correo electrónico contenido, etc.

 import imaplib, email, os user = "your@email.com" password = "pass" imap_url = "imap.gmail.com" connection = imaplib.IMAP4_SSL(imap_url) connection.login(user, password) result, data = connection.uid('search', None, "ALL") if result == 'OK' for num in data[0].split(): result, data = connection.uid('fetch', num, '(RFC822)') if result == 'OK': email_message = email.message_from_bytes(data[0][1]) print('From:' + email_message['From']) print('To:' + email_message['To']) print('Date:' + email_message['Date']) print('Subject:' + str(email_message['Subject'])) print('Content:' + str(email_message.get_payload()[0])) connection.close() connection.logout()