Skip to content

Instantly share code, notes, and snippets.

@robulouski
Last active April 19, 2024 02:27
Show Gist options
  • Save robulouski/7441883 to your computer and use it in GitHub Desktop.
Save robulouski/7441883 to your computer and use it in GitHub Desktop.
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()
@sherarIG
Copy link

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

@Schizo
Copy link

Schizo commented Feb 23, 2016

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

@aniketanvaria
Copy link

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

@hollerith
Copy link

Doesn't work with two-way verification unless:

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

@nachobonilla
Copy link

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
Copy link

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
Copy link

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

@James-Dias
Copy link

def process_mailbox (M )

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

Sorry and discomfort

Thank you!

@jos-h
Copy link

jos-h commented Apr 27, 2017

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

@ujjaldey
Copy link

body can be obtained by msg.get_payload()

@bhathiyalokuketagoda
Copy link

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
Copy link

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
Copy link

mcintst commented Jul 29, 2017

thanks for getting me started with imaplib

@Fomchenkov
Copy link

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
Copy link

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
Copy link

Thanks so much for this!

@satyakrishnapst
Copy link

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
Copy link

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
Copy link

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
Copy link

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
Copy link

@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
Copy link

Then also make sure you are correctly supplying your login details

@belavadirashmi
Copy link

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

@rosscg
Copy link

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
Copy link

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
Copy link

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

@codingPrecursor
Copy link

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
Copy link

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
Copy link

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
Copy link

@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