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)
Author by
molakalapalli ramesh
Updated on July 09, 2022Comments
-
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?