How to get unread messages and set message read flags over IMAP using Python?

29,605

Solution 1

import imaplib

def read(username, password, sender_of_interest):
    # Login to INBOX
    imap = imaplib.IMAP4_SSL("imap.gmail.com", 993)
    imap.login(username, password)
    imap.select('INBOX')

    # Use search(), not status()
    status, response = imap.search(None, 'INBOX', '(UNSEEN)')
    unread_msg_nums = response[0].split()

    # Print the count of all unread messages
    print len(unread_msg_nums)

    # Print all unread messages from a certain sender of interest
    status, response = imap.search(None, '(UNSEEN)', '(FROM "%s")' % (sender_of_interest))
    unread_msg_nums = response[0].split()
    da = []
    for e_id in unread_msg_nums:
        _, response = imap.fetch(e_id, '(UID BODY[TEXT])')
        da.append(response[0][1])
    print da

    # Mark them as seen
    for e_id in unread_msg_nums:
        imap.store(e_id, '+FLAGS', '\Seen')

Solution 2

def read(username, password, sender_of_interest=None):
    # Login to INBOX
    imap = imaplib.IMAP4_SSL("imap.gmail.com", 993)
    imap.login(username, password)
    imap.select('INBOX')
    # Use search(), not status()
    # Print all unread messages from a certain sender of interest
    if sender_of_interest:
        status, response = imap.uid('search', None, 'UNSEEN', 'FROM {0}'.format(sender_of_interest))
    else:
        status, response = imap.uid('search', None, 'UNSEEN')
    if status == 'OK':
        unread_msg_nums = response[0].split()
    else:
        unread_msg_nums = []
    data_list = []
    for e_id in unread_msg_nums:
        data_dict = {}
        e_id = e_id.decode('utf-8')
        _, response = imap.uid('fetch', e_id, '(RFC822)')
        html = response[0][1].decode('utf-8')
        email_message = email.message_from_string(html)
        data_dict['mail_to'] = email_message['To']
        data_dict['mail_subject'] = email_message['Subject']
        data_dict['mail_from'] = email.utils.parseaddr(email_message['From'])
        data_dict['body'] = email_message.get_payload()
        data_list.append(data_dict)
    print(data_list)
Share:
29,605
molakalapalli ramesh
Author by

molakalapalli ramesh

Updated on July 09, 2022

Comments

  • molakalapalli ramesh
    molakalapalli ramesh almost 2 years
    import imaplib
    def read():
    
        userName = "[email protected]"
        password = "xxxx" 
        name = '[email protected]'
        email_ids = [userName]
        data = []
        imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993)
        imap_server.login(userName, password)
        imap_server.select('INBOX')
        da = []
        status, response = imap_server.status('INBOX', "(UNSEEN)")
        unreadcount = int(response[0].split()[2].strip(').,]'))
        print unreadcount
    
        status, response = imap_server.search(None, '(FROM "[email protected]")')
        email_ids = [e_id for e_id in response[0].split()]
        for e_id in email_ids:
            _, response = imap_server.fetch(e_id, '(UID BODY[TEXT])')
            da.append(response[0][1])
        print da
    
    
    read()
    

    How to organise the code above, to read only unread mails? Also, once we read them, how to mark the messages as read mail using Python?