Get only NEW Emails imaplib and python Get only NEW Emails imaplib and python python python

Get only NEW Emails imaplib and python


Something like this will do the trick.

conn = imaplib.IMAP4_SSL(imap_server)try:    (retcode, capabilities) = conn.login(imap_user, imap_password)except:    print sys.exc_info()[1]    sys.exit(1)conn.select(readonly=1) # Select inbox or default namespace(retcode, messages) = conn.search(None, '(UNSEEN)')if retcode == 'OK':    for num in messages[0].split(' '):        print 'Processing :', message        typ, data = conn.fetch(num,'(RFC822)')        msg = email.message_from_string(data[0][1])        typ, data = conn.store(num,'-FLAGS','\\Seen')        if ret == 'OK':            print data,'\n',30*'-'            print msgconn.close()

There's also a duplicate question here - Find new messages added to an imap mailbox since I last checked with python imaplib2?

Two useful functions for you to retrieve the body and attachments of the new message you detected (reference: How to fetch an email body using imaplib in python?) -

def getMsgs(servername="myimapserverfqdn"):  usernm = getpass.getuser()  passwd = getpass.getpass()  subject = 'Your SSL Certificate'  conn = imaplib.IMAP4_SSL(servername)  conn.login(usernm,passwd)  conn.select('Inbox')  typ, data = conn.search(None,'(UNSEEN SUBJECT "%s")' % subject)  for num in data[0].split():    typ, data = conn.fetch(num,'(RFC822)')    msg = email.message_from_string(data[0][1])    typ, data = conn.store(num,'-FLAGS','\\Seen')    yield msgdef getAttachment(msg,check):  for part in msg.walk():    if part.get_content_type() == 'application/octet-stream':      if check(part.get_filename()):        return part.get_payload(decode=1)

PS: If you pass by in 2020 after python 2.7 death: replace email.message_from_string(data[0][1]) with email.message_from_bytes(data[0][1])


The above answer does not actually work anymore or maybe never did but i modified it so it returns only unseen messages, it used to give : error cannot parse fetch command or something like that here is a working code :

mail = imaplib.IMAP4_SSL('imap.gmail.com')(retcode, capabilities) = mail.login('email','pass')mail.list()mail.select('inbox')n=0(retcode, messages) = mail.search(None, '(UNSEEN)')if retcode == 'OK':   for num in messages[0].split() :      print 'Processing '      n=n+1      typ, data = mail.fetch(num,'(RFC822)')      for response_part in data:         if isinstance(response_part, tuple):             original = email.message_from_string(response_part[1])             print original['From']             print original['Subject']             typ, data = mail.store(num,'+FLAGS','\\Seen')print n

I think the error was coming from the messages[0].split(' ') but the above code should work fine.

Also, note the +FLAGS instead of -FLAGS which flags the message as read.

EDIT 2020: If you pass by in 2020 after python 2.7 death: replace email.message_from_string(data[0][1]) with email.message_from_bytes(data[0][1])


original = email.message_from_string(response_part[1])

Needs to be changes to:

original = email.message_from_bytes(response_part[1])