Getting n most recent emails using IMAP and Python

24,174

Solution 1

The sort command is available, but it is not guaranteed to be supported by the IMAP server. For example, Gmail does not support the SORT command.

To try the sort command, you would replace:
M.search(None, 'ALL')
with
M.sort(search_critera, 'UTF-8', 'ALL')

Then search_criteria would be a string like:

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

According to RFC5256 these are valid sort-key's:
"ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" / "SUBJECT" / "TO"

Notes:
1. charset is required, try US-ASCII or UTF-8 all others are not required to be supported by the IMAP server
2. search critera is also required. The ALL command is a valid one, but there are many. See more at http://www.networksorcery.com/enp/rfc/rfc3501.txt

The world of IMAP is wild and crazy. Good luck

Solution 2

This is the code to get the emailFrom, emailSubject, emailDate, emailContent etc..

import imaplib, email, os
user = "[email protected]"
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()        

Solution 3

# get recent one email
from imap_tools import MailBox
with MailBox('imap.mail.com').login('[email protected]', 'password', 'INBOX') as mailbox:
   for message in mailbox.fetch(limit=1, reverse=True):
       print(msg.date_str, msg.subject)

https://github.com/ikvk/imap_tools

Share:
24,174

Related videos on Youtube

mrmagooey
Author by

mrmagooey

Updated on July 09, 2022

Comments

  • mrmagooey
    mrmagooey almost 2 years

    I'm looking to return the n (most likely 10) most recent emails from an email accounts inbox using IMAP.

    So far I've cobbled together:

    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']
    

    This is returning email headers fine, but it seems to be a semi-random collection of emails that it gets, not the 10 most recent.

    If it helps, I'm connecting to an Exchange 2010 server. Other approaches also welcome, IMAP just seemed the most appropriate given that I only wanted to read the emails not send any.

  • mrmagooey
    mrmagooey about 13 years
    Using the sort method with any of the sort-keys returns: imaplib.error: SORT command error: BAD ['Command Error. 12'], I can't work out if this is because Outlook doesn't support the SORT call/method/argument, or because I'm using IMAPlibs sort method the wrong way.
  • mrmagooey
    mrmagooey about 13 years
    Using the third party library IMAPClient, trying the sort method raises an exception telling me that the server doesn't support the sort method.
  • rfadams
    rfadams about 13 years
    Yea, sorry to hear that. Like I said, the sort method is not a requirement according to the specs. I don't have access to an Exchange or I would have tried it for you.
  • toutpt
    toutpt over 12 years
    GMAIL imap for example doesn't support the sort command ... I'm in that case, it seems you need to get every emails, and sort it by yourself.
  • try-catch-finally
    try-catch-finally about 6 years
    Wall of code and no explanation. Can you please add some explanation how the code is working so that beginners may get a better understanding.

Related