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

3

8
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?

Massa answered 4/4, 2014 at 7:23 Comment(0)
B
16
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')
Barns answered 4/4, 2014 at 8:10 Comment(0)
L
3
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)
Leid answered 23/1, 2017 at 10:51 Comment(0)
S
2

You may use my lib - imap_tools: https://pypi.org/project/imap-tools/

from imap_tools import MailBox, A

# get subjects of unseen emails from INBOX folder
with MailBox('imap.mail.com').login('[email protected]', 'pwd') as mailbox:
    subjects = [msg.subject for msg in mailbox.fetch(A(seen=False), mark_seen=True)]
Sorn answered 10/10, 2019 at 15:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.