Python, IMAP, and GMail. Mark posts as SEEN

I have a python script that should retrieve invisible messages, process them and mark them as visible (or read)

I do this after login:

typ, data = self.server.imap_server.search(None, '(UNSEEN)') for num in data[0].split(): print "Mensage " + str(num) + " mark" self.server.imap_server.store(num, '+FLAGS', '(SEEN)') 

The first problem is that the search returns ALL messages, not just UNSEEN. The second problem is that messages are not marked as SEEN.

Can someone give me a hand with this?

Thanks!

+7
python email imap gmail
source share
3 answers
 import imaplib obj = imaplib.IMAP4_SSL('imap.gmail.com', '993') obj.login('user', 'password') obj.select('Inbox') <--- it will select inbox typ ,data = obj.search(None,'UnSeen') obj.store(data[0].replace(' ',','),'+FLAGS','\Seen') 
+12
source share

I think flag names should start with a backslash, for example: \ SEEN

+3
source share

I am not very familiar with imaplib, but I am implementing it well with the imapclient module

 import imapclient,pyzmail,html2text from backports import ssl context=ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) iobj=imapclient.IMAPClient('outlook.office365.com', ssl=True, ssl_context=context) iobj.login(uname,pwd)# provide your username and password iobj.select_folder('INBOX',readonly=True)# Selecting Inbox. unread=iobj.search('UNSEEN')# Selecting Unread messages, you can add more search criteria here to suit your purpose.'FROM', 'SINCE' etc. print('There are: ',len(unread),' UNREAD emails') for i in unread: mail=iobj.fetch(i,['BODY[]'])#I'm fetching the body of the email here. mcontent=pyzmail.PyzMessage.factory(mail[i][b'BODY[]'])#This returns the email content in HTML format subject=mcontent.get_subject()# You might not need this receiver_name,receiver_email=mcontent.get_address('from') mail_body=html2text.html2text(mcontent.html_part.get_payload().decode(mcontent.html_part.charset))# This returns the email content as text that you can easily relate with. 

Say I just want to see unread emails, reply to the sender and mark it as read. I would call the smtp function here to compose and send the answer.

 import smtplib smtpobj=smtplib.SMTP('smtp.office365.com',587) smtpobj.starttls() smtpobj.login(uname,pwd)# Your username and password goes here. sub='Subject: '+str(subject)+'\n\n'# Subject of your reply msg='Thanks for your email! You're qualified for the next round' #Some random reply :( fullmsg=sub+new_result smtpobj.sendmail(uname,test,fullmsg)# This sends the email. iobj.set_flags(i,['\\Seen','\\Answered'])# This marks the email as read and adds the answered flag iobj.append('Sent Items', fullmsg)# This puts a copy of your reply in your Sent Items. iobj.logout() smtpobj.logout() 

I hope this helps

0
source share

All Articles