Fetch an email with imaplib but do not mark it as SEEN
Question:
I want to parse some emails from a user ‘s inbox but when I do:
typ, msg_data = imap_conn.fetch(uid, '(RFC822)')
It marks the email as SEEN or read. This is not the desired functionality. Do you know how can I keep the email at its previous stare either SEEN or NOT SEEN?
Answers:
You can use (RFC822.PEEK)
as the "message-parts" argument, according to RFC 1730 (I have not verified which servers actually implement that correctly, but it doesn’t seem hard for them to).
The following should work:
typ, msg_data = imap_conn.fetch(uid, '(BODY.PEEK[HEADER])')
or BODY.PEEK[TEXT]
, etc.
You might also set read_only
to true when selecting the folder:
imap_conn.select('Inbox', readonly=True)
You may use imap_tools package:
https://pypi.org/project/imap-tools/
from imap_tools import MailBox, Q
# get list of email subjects from INBOX folder
with MailBox('imap.mail.com').login('[email protected]', 'password') as mailbox:
# mark_seen=False - not mark emails as seen on fetch
subjects = [msg.subject for msg in mailbox.fetch(mark_seen=False)]
BODY.PEEK[] do work with gmail.
I want to parse some emails from a user ‘s inbox but when I do:
typ, msg_data = imap_conn.fetch(uid, '(RFC822)')
It marks the email as SEEN or read. This is not the desired functionality. Do you know how can I keep the email at its previous stare either SEEN or NOT SEEN?
You can use (RFC822.PEEK)
as the "message-parts" argument, according to RFC 1730 (I have not verified which servers actually implement that correctly, but it doesn’t seem hard for them to).
The following should work:
typ, msg_data = imap_conn.fetch(uid, '(BODY.PEEK[HEADER])')
or BODY.PEEK[TEXT]
, etc.
You might also set read_only
to true when selecting the folder:
imap_conn.select('Inbox', readonly=True)
You may use imap_tools package:
https://pypi.org/project/imap-tools/
from imap_tools import MailBox, Q
# get list of email subjects from INBOX folder
with MailBox('imap.mail.com').login('[email protected]', 'password') as mailbox:
# mark_seen=False - not mark emails as seen on fetch
subjects = [msg.subject for msg in mailbox.fetch(mark_seen=False)]
BODY.PEEK[] do work with gmail.