'Python imaplib only check message if its unread

I am trying to set imaplib to only only work, if there is a new email in the inbox. I tried to do this with a code I found online, and added a while loop to it, and it works perfectly, but it always prints the message even if its he same email. Here is what i did:

import imaplib
import email
mail = "[email protected]"
password = "password"
imap = imaplib.IMAP4_SSL("imap.gmail.com")
imap.login(mail,password)
N = 1

while True:

            status, messages = imap.select("INBOX")
            messages = int(messages[0])

            for i in range(messages, messages-N, -1):
                res, msg = imap.fetch(str(i), "(RFC822)")
                for response in msg:
                    if isinstance(response, tuple):
                        # parse a bytes email into a message object
                        msg = email.message_from_bytes(response[1])
                        if msg.is_multipart():
                            # iterate over email parts
                            for part in msg.walk():
                                # extract content type of email
                                content_type = part.get_content_type()
                                content_disposition = str(part.get("Content-Disposition"))
                                try:
                                    # get the email body
                                    body = part.get_payload(decode=True).decode()
                                except:
                                    pass
                                if content_type == "text/plain" and "attachment" not in content_disposition:
                                    # print text/plain emails and skip attachments
                                    print(body)
                        else:
                            # extract content type of email
                            content_type = msg.get_content_type()
                            # get the email body
                            body = msg.get_payload(decode=True).decode()

                            if content_type == "text/plain":
                                # print only text email parts
                                print(body)

This does the job, and prints the message of the newest email, and if i send a new email it will read that, change the body to the new message and print it. But my problem is that it will keep printing the the same message, until a new one arrives, and than it prints that again and again until another one arrives. Like this:

this is a message # keeps printing it until new email arrives
this is a message
this is a message
this is a message
# new email arrives
this is the message of the new email
this is the message of the new email
this is the message of the new email

How can I make it so, that it only checks for new/unread emails, or it only activates when there is a new email in the inbox? Maybe there is something that can put it into an idle mode?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source