Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Very basic example of using Python and IMAP to iterate over emails in a gmail folder/label. http://www.voidynullness.net/blog/2013/07/25/gmail-email-with-python-via-imap/
#!/usr/bin/env python
#
# Very basic example of using Python and IMAP to iterate over emails in a
# gmail folder/label. This code is released into the public domain.
#
# RKI July 2013
# http://www.voidynullness.net/blog/2013/07/25/gmail-email-with-python-via-imap/
#
import sys
import imaplib
import getpass
import email
import email.header
import datetime
EMAIL_ACCOUNT = "notatallawhistleblowerIswear@gmail.com"
EMAIL_FOLDER = "Top Secret/PRISM Documents"
def process_mailbox(M):
"""
Do something with emails messages in the folder.
For the sake of this example, print some headers.
"""
rv, data = M.search(None, "ALL")
if rv != 'OK':
print "No messages found!"
return
for num in data[0].split():
rv, data = M.fetch(num, '(RFC822)')
if rv != 'OK':
print "ERROR getting message", num
return
msg = email.message_from_string(data[0][1])
decode = email.header.decode_header(msg['Subject'])[0]
subject = unicode(decode[0])
print 'Message %s: %s' % (num, subject)
print 'Raw Date:', msg['Date']
# Now convert to local date-time
date_tuple = email.utils.parsedate_tz(msg['Date'])
if date_tuple:
local_date = datetime.datetime.fromtimestamp(
email.utils.mktime_tz(date_tuple))
print "Local Date:", \
local_date.strftime("%a, %d %b %Y %H:%M:%S")
M = imaplib.IMAP4_SSL('imap.gmail.com')
try:
rv, data = M.login(EMAIL_ACCOUNT, getpass.getpass())
except imaplib.IMAP4.error:
print "LOGIN FAILED!!! "
sys.exit(1)
print rv, data
rv, mailboxes = M.list()
if rv == 'OK':
print "Mailboxes:"
print mailboxes
rv, data = M.select(EMAIL_FOLDER)
if rv == 'OK':
print "Processing mailbox...\n"
process_mailbox(M)
M.close()
else:
print "ERROR: Unable to open mailbox ", rv
M.logout()
#!/usr/bin/env python
#
# Very basic example of using Python 3 and IMAP to iterate over emails in a
# gmail folder/label. This code is released into the public domain.
#
# This script is example code from this blog post:
# http://www.voidynullness.net/blog/2013/07/25/gmail-email-with-python-via-imap/
#
# This is an updated version of the original -- modified to work with Python 3.4.
#
import sys
import imaplib
import getpass
import email
import email.header
import datetime
EMAIL_ACCOUNT = "notatallawhistleblowerIswear@gmail.com"
# Use 'INBOX' to read inbox. Note that whatever folder is specified,
# after successfully running this script all emails in that folder
# will be marked as read.
EMAIL_FOLDER = "Top Secret/PRISM Documents"
def process_mailbox(M):
"""
Do something with emails messages in the folder.
For the sake of this example, print some headers.
"""
rv, data = M.search(None, "ALL")
if rv != 'OK':
print("No messages found!")
return
for num in data[0].split():
rv, data = M.fetch(num, '(RFC822)')
if rv != 'OK':
print("ERROR getting message", num)
return
msg = email.message_from_bytes(data[0][1])
hdr = email.header.make_header(email.header.decode_header(msg['Subject']))
subject = str(hdr)
print('Message %s: %s' % (num, subject))
print('Raw Date:', msg['Date'])
# Now convert to local date-time
date_tuple = email.utils.parsedate_tz(msg['Date'])
if date_tuple:
local_date = datetime.datetime.fromtimestamp(
email.utils.mktime_tz(date_tuple))
print ("Local Date:", \
local_date.strftime("%a, %d %b %Y %H:%M:%S"))
M = imaplib.IMAP4_SSL('imap.gmail.com')
try:
rv, data = M.login(EMAIL_ACCOUNT, getpass.getpass())
except imaplib.IMAP4.error:
print ("LOGIN FAILED!!! ")
sys.exit(1)
print(rv, data)
rv, mailboxes = M.list()
if rv == 'OK':
print("Mailboxes:")
print(mailboxes)
rv, data = M.select(EMAIL_FOLDER)
if rv == 'OK':
print("Processing mailbox...\n")
process_mailbox(M)
M.close()
else:
print("ERROR: Unable to open mailbox ", rv)
M.logout()
@psmlbhor

This comment has been minimized.

Copy link

@psmlbhor psmlbhor commented Jun 15, 2015

I checked your gmail_imap_example.py program and it has a small mistake in it. On line number 38, the 'h' in the decode = email.header.decode_header(msg['Subject'])[0], should be capital

@sherarIG

This comment has been minimized.

Copy link

@sherarIG sherarIG commented Jan 11, 2016

Sorry, in this example, how can I get the body of the email printed?
Regards,

@Schizo

This comment has been minimized.

Copy link

@Schizo Schizo commented Feb 23, 2016

Is this working as well with 2-way-verification?

@aniketanvaria

This comment has been minimized.

Copy link

@aniketanvaria aniketanvaria commented Feb 23, 2016

For me it's printing "LOGIN FAILED!!" what could be possible reason and how to rectify it..

@hollerith

This comment has been minimized.

Copy link

@hollerith hollerith commented Feb 24, 2016

Doesn't work with two-way verification unless:

https://www.google.com/settings/security/lesssecureapps

@nachobonilla

This comment has been minimized.

Copy link

@nachobonilla nachobonilla commented May 1, 2016

I'm trying to adapt the code so that i could print some more data from the e-mails. I´m having trouble understanding what this piece of code does:
for num in data[0].split():
rv, data = M.fetch(num, '(RFC822)')
if rv != 'OK':
print("ERROR getting message", num)
return

    msg = email.message_from_bytes(data[0][1])
    hdr = email.header.make_header(email.header.decode_header(msg['Subject']))

if you could help me i would appreciate it

@cssidy

This comment has been minimized.

Copy link

@cssidy cssidy commented Jun 6, 2016

I was getting the login failed message, even without two-way verification, until I enabled access from less secure maps in the Gmail settings. Thank you @hollerith for mentioning this https://www.google.com/settings/security/lesssecureapps

@mkeresztes

This comment has been minimized.

Copy link

@mkeresztes mkeresztes commented Jul 18, 2016

For two-way verification the best and recommended solution is to generate an app password https://security.google.com/settings/security/apppasswords.

@James-Dias

This comment has been minimized.

Copy link

@James-Dias James-Dias commented Aug 19, 2016

def process_mailbox (M )

What is the parameter (M ) ? You get what ?

Sorry and discomfort

Thank you!

@jos-h

This comment has been minimized.

Copy link

@jos-h jos-h commented Apr 27, 2017

James-Dias 'M' here is the IMAP4 Instance which is passed to process_mailbox().

@ujjaldey

This comment has been minimized.

Copy link

@ujjaldey ujjaldey commented Jun 10, 2017

body can be obtained by msg.get_payload()

@bhathiyalokuketagoda

This comment has been minimized.

Copy link

@bhathiyalokuketagoda bhathiyalokuketagoda commented Jul 2, 2017

nice code, it helps me to understand a lot about email handling, but is there any way to extract the attachments in the email separately or to save a message in as a file.

@one3appstudio

This comment has been minimized.

Copy link

@one3appstudio one3appstudio commented Jul 15, 2017

I have written Python code that downloads the attachments and also generate an excel fie as log which has the hyperlink to the attachments.
Take a look at my blog

@mcintst

This comment has been minimized.

Copy link

@mcintst mcintst commented Jul 29, 2017

thanks for getting me started with imaplib

@Fomchenkov

This comment has been minimized.

Copy link

@Fomchenkov Fomchenkov commented Jul 29, 2017

Hello! How can I get decoded content?
content = str(email.header.make_header(email.header.decode_header(str(msg.get_payload()[0]))))
It returns encoded string :(

@tyarr

This comment has been minimized.

Copy link

@tyarr tyarr commented Aug 22, 2017

line 71 of gmail_imap_python3.py could easily be changed to use pprint instead of print for easier reading 👍
pprint.pprint(mailboxes)

Remember to import pprint

@rjpcasalino

This comment has been minimized.

Copy link

@rjpcasalino rjpcasalino commented Sep 11, 2017

Thanks so much for this!

@satyakrishnapst

This comment has been minimized.

Copy link

@satyakrishnapst satyakrishnapst commented Feb 15, 2018

Thanks a lot bro its worked me bro... now i want to read an attachement file from gmail is above code is similar to that one or not..?

@PavanTejaReddy

This comment has been minimized.

Copy link

@PavanTejaReddy PavanTejaReddy commented May 15, 2018

Thanks for the code. Is there a way to read or download an attachment ? I have been looking for it from 2 days, but didn't find any. Can someone help me plz.
Thank You

@fjsanzano

This comment has been minimized.

Copy link

@fjsanzano fjsanzano commented Jun 8, 2018

Nice code i used to save my mail in html file addin this few lines after "print('Raw Date:', msg['Date'])"

     content = str(msg.get_payload())
    #cleaning the file name
    filename_split = subject.replace(':','-').split(' de ')
    # if file name is correct
    if len(filename_split):
        # building the file name
        filename = filename_split[1]+filename_split[0]+'.html'
        #create the html file with the rigth encoding
        f=open(filename,'w',encoding='iso-8859-1')
        f.write(content)
        f.close

thank you all

@sree-cgit

This comment has been minimized.

Copy link

@sree-cgit sree-cgit commented Jul 4, 2018

I have tried the above code but it is throwing the below error.
[ALERT] Please log in via your web browser: https://support.google.com/mail/accounts/answer/78754 (Failure)
Please help

@ogwurujohnson

This comment has been minimized.

Copy link

@ogwurujohnson ogwurujohnson commented Jul 18, 2018

@sree-cgit, login to your google account, click this link https://myaccount.google.com/security , on the page scroll to the bottom of the page and turn ON "Allow less secure Apps"

@ogwurujohnson

This comment has been minimized.

Copy link

@ogwurujohnson ogwurujohnson commented Jul 18, 2018

Then also make sure you are correctly supplying your login details

@belavadirashmi

This comment has been minimized.

Copy link

@belavadirashmi belavadirashmi commented Sep 3, 2018

@robulouski
:)..thanks , this helped me get started with email on python.

@rosscg

This comment has been minimized.

Copy link

@rosscg rosscg commented Nov 20, 2018

Hello! How can I get decoded content?
content = str(email.header.make_header(email.header.decode_header(str(msg.get_payload()[0]))))
It returns encoded string :(

Decode with:
data.decode("utf-8")

@myxyzy

This comment has been minimized.

Copy link

@myxyzy myxyzy commented Mar 24, 2019

I could not run the code with my yahoo mail account?
How can I convert it to yahoo?
Thanks

@PandaWhoCodes

This comment has been minimized.

Copy link

@PandaWhoCodes PandaWhoCodes commented Apr 1, 2019

Can you try this code?
It works for Gmail and Yahoo
https://gist.github.com/PandaWhoCodes/f7adce3bff9bb1f508b3ab42db05a6bf

@codingPrecursor

This comment has been minimized.

Copy link

@codingPrecursor codingPrecursor commented Sep 21, 2019

Can someone please let me know how to search gmail messages that are grouped. So, let's say I have 1000 emails and are grouped to send 100 email messages in one email, so we will see 10 emails for 1000 email messages. How to retrieve the grouped emails like this ?

@Arjun-Arvindakshan

This comment has been minimized.

Copy link

@Arjun-Arvindakshan Arjun-Arvindakshan commented Feb 6, 2020

Hi..
Is there anyway we can parse data if the body of the email is an html content?
How do we pass this information to this code?

@pizzabreath

This comment has been minimized.

Copy link

@pizzabreath pizzabreath commented Jun 15, 2020

Absolutely splendid! Thanks a lot for this mate.

Do you happen to have a snippet to send SMTP mails in Python3 as well? Cheers!

@pythoninthegrass

This comment has been minimized.

Copy link

@pythoninthegrass pythoninthegrass commented Jul 19, 2020

@pizzabreath Check out this snippet from Real Python for Gmail with getpass added on my end (vs. input):

from getpass import getpass
import smtplib
import ssl

port = 465  # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "my@gmail.com"  # Enter your address
receiver_email = "your@gmail.com"  # Enter receiver address
password = getpass("Type your password and press enter: ")
message = """\
Subject: Hi there

This message is sent from Python."""

context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment