How to fetch an email body using imaplib in python? How to fetch an email body using imaplib in python? python python

How to fetch an email body using imaplib in python?


No... imaplib is a pretty good library, it's imap that's so unintelligible.

You may wish to check that t == 'OK', but data[0][1] works as expected for as much as I've used it.

Here's a quick example I use to extract signed certificates I've received by email, not bomb-proof, but suits my purposes:

import getpass, os, imaplib, emailfrom OpenSSL.crypto import load_certificate, FILETYPE_PEMdef getMsgs(servername="myimapserverfqdn"):  usernm = getpass.getuser()  passwd = getpass.getpass()  subject = 'Your SSL Certificate'  conn = imaplib.IMAP4_SSL(servername)  conn.login(usernm,passwd)  conn.select('Inbox')  typ, data = conn.search(None,'(UNSEEN SUBJECT "%s")' % subject)  for num in data[0].split():    typ, data = conn.fetch(num,'(RFC822)')    msg = email.message_from_string(data[0][1])    typ, data = conn.store(num,'-FLAGS','\\Seen')    yield msgdef getAttachment(msg,check):  for part in msg.walk():    if part.get_content_type() == 'application/octet-stream':      if check(part.get_filename()):        return part.get_payload(decode=1)if __name__ == '__main__':  for msg in getMsgs():    payload = getAttachment(msg,lambda x: x.endswith('.pem'))    if not payload:      continue    try:      cert = load_certificate(FILETYPE_PEM,payload)    except:      cert = None    if cert:      cn = cert.get_subject().commonName      filename = "%s.pem" % cn      if not os.path.exists(filename):        open(filename,'w').write(payload)        print "Writing to %s" % filename      else:        print "%s already exists" % filename


The IMAPClient package is a fair bit easier to work with. From the description:

Easy-to-use, Pythonic and complete IMAP client library.


Try my package:https://pypi.org/project/imap-tools/

example:

from imap_tools import MailBox# get list of email bodies from INBOX folderwith MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:    bodies = [msg.text or msg.html for msg in mailbox.fetch()]

Features:

  • Parsed email message attributes
  • Query builder for searching emails
  • Work with emails in folders (copy, delete, flag, move, append)
  • Work with mailbox folders (list, set, get, create, exists, rename, delete, status)
  • No dependencies