Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Python script to download all gmail attachments.
# Something in lines of http://stackoverflow.com/questions/348630/how-can-i-download-all-emails-with-attachments-from-gmail
# Make sure you have IMAP enabled in your gmail settings.
# Right now it won't download same file name twice even if their contents are different.
import email
import getpass, imaplib
import os
import sys
detach_dir = '.'
if 'attachments' not in os.listdir(detach_dir):
os.mkdir('attachments')
userName = raw_input('Enter your GMail username:')
passwd = getpass.getpass('Enter your password: ')
try:
imapSession = imaplib.IMAP4_SSL('imap.gmail.com')
typ, accountDetails = imapSession.login(userName, passwd)
if typ != 'OK':
print 'Not able to sign in!'
raise
imapSession.select('[Gmail]/All Mail')
typ, data = imapSession.search(None, 'ALL')
if typ != 'OK':
print 'Error searching Inbox.'
raise
# Iterating over all emails
for msgId in data[0].split():
typ, messageParts = imapSession.fetch(msgId, '(RFC822)')
if typ != 'OK':
print 'Error fetching mail.'
raise
emailBody = messageParts[0][1]
mail = email.message_from_string(emailBody)
for part in mail.walk():
if part.get_content_maintype() == 'multipart':
# print part.as_string()
continue
if part.get('Content-Disposition') is None:
# print part.as_string()
continue
fileName = part.get_filename()
if bool(fileName):
filePath = os.path.join(detach_dir, 'attachments', fileName)
if not os.path.isfile(filePath) :
print fileName
fp = open(filePath, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
imapSession.close()
imapSession.logout()
except :
print 'Not able to download all attachments.'
@nincehelser

This comment has been minimized.

Copy link

nincehelser commented Jul 20, 2013

This is a really useful script! I ran it on my gmail account and found old pictures that I had lost track of years ago!

Can you point me to more documentation on the imap library functions? Specifically I want to narrow the search based on time. For example, I just want to check the files sent in the last 24 hours.

I'm new to Python and haven't figured out where this sort of stuff is documented yet, so any advice is appreciated.

Thanks!

@gDesbiens

This comment has been minimized.

Copy link

gDesbiens commented Aug 24, 2013

It seems that this worked for nincehelser, however it doesn't seems to connect for me. I add 'print 'li 22'' to know it does go, at least to this point, which it does. But I don't get any of the print statement (Not able to sign in!, sign in successful nor Error searching Inbox.), all I got is : Not able to download all attachments..

My gmail account setting is at enable IMAP, if you have any clue why it doesn't work please help, I have made a lot of research without success.

I'm working with Python 2.7.3, if it make any difference..

@victorfang

This comment has been minimized.

Copy link

victorfang commented Feb 13, 2014

got the same error as gDesbiens. any fix on this??

@benjamin-l-johnson

This comment has been minimized.

Copy link

benjamin-l-johnson commented Jun 14, 2014

I opened the project in sublime text, converted all the spaces to tabs for indenting then just had to re-indent line 21 but after that it worked perfectly for me

@4line

This comment has been minimized.

Copy link

4line commented Jul 11, 2014

hi it really help code for me..but is it possible we can download all attachment..say i had download all 5000 of my gmail email.And i after go through i found almost 1000 email got an attachemnt.But I only able to download 40 attachmnt .what is the real problem actually..any idea will definitely appreciate.thanks

@BalaSmart

This comment has been minimized.

Copy link

BalaSmart commented Jul 17, 2014

Hi this s working like a charm to me.. But i want to download specific type of files such as PDF or Xls.
I'm new to python so i need some help to achieve it.

Thanks.
Bala

@BalaSmart

This comment has been minimized.

Copy link

BalaSmart commented Jul 21, 2014

Is there any way to download attachments from any other email services than gmail?
Ex: (yahoo, in, hot mail, etc ..)
Please help me if it is possible...

@yeahdef

This comment has been minimized.

Copy link

yeahdef commented Apr 21, 2015

@BalaSmart check out python-magic library for resolving filetypes

@lbollar

This comment has been minimized.

Copy link

lbollar commented Apr 23, 2015

This is great. Thanks for sharing this.

@xiconet

This comment has been minimized.

Copy link

xiconet commented May 17, 2015

Very helpful, thanks again. Now I'm looking for a way to select which attachments I actually want to store as they appear without downloading the file data. I suppose that imaplib allows this in a way or another.

@BalaSmart: Any provider allowing IMAP should let you use this kind of script. Just change the server name (set here to imap.google.com) accordingly, i.e. to something like imap.some_mail_provider.com, and of course your username (or email) and password.

@anyone: check the "official" python docs for the imaplib and email libraries for ways to adapt/enhance this code to specific needs.

@sarveshgalgalikar

This comment has been minimized.

Copy link

sarveshgalgalikar commented Jun 11, 2015

What if i just need text portion on the emails and store them into excel or in .csv format?
I am new to python and need to learn above.

@gpamfilis

This comment has been minimized.

Copy link

gpamfilis commented Jul 21, 2015

Hello, what if someone wanted to download from a specific label? such as "Work" (created by the user).

thank you

@lewisde

This comment has been minimized.

Copy link

lewisde commented Aug 6, 2015

I had to update line 38 to support UTF-8 to get it to work.

@gpamfilis, change line 24 to the label you want to use.

@amit-iiitm

This comment has been minimized.

Copy link

amit-iiitm commented Sep 14, 2015

I am unable to connect to imap.gmail.com the shell shows "gaierror: [Errno -2] Name or service not known" .

@Chaya9

This comment has been minimized.

Copy link

Chaya9 commented Jan 7, 2016

how to extract all the links from email message body using imap in python

@pythonpb13

This comment has been minimized.

Copy link

pythonpb13 commented Feb 28, 2016

I want to extract the below parts of the email separately which is in exchange server.

To : This field is in UTF-8 characters Ex : उपयोगकर्ता@उदाहरण.कॉम (Hindi, Unicode)

From : This field is in UTF-8 characters EX : θσερ@εχαμπλε.ψομ (Ukrainian, Unicode)

Subject : This field is in UTF-8 Characters EX : 你好!你好嗎 ? (Chinese, Unicode)

Message Body: This field is in UTF-8 characters Ex : Hallo wie geht's dir ? (German, Unicode). The message body in mail is always html format.

Name of the attachment file: بلدي مرفق ملف.pdf (It's in Arabic , Unicode). The attachment is in PDF format always.

@vshirin1

This comment has been minimized.

Copy link

vshirin1 commented May 12, 2016

how could i restrict the search to a specific date range /

@adityatrilok90

This comment has been minimized.

Copy link

adityatrilok90 commented May 30, 2016

I have attachments in my inbox but it is directly going to the "Not able to download all attachments." message.. Could anyone pl help!

@ehanove

This comment has been minimized.

Copy link

ehanove commented Jun 13, 2016

I have the same question as vhsirin1, but in terms of only downloading the attachments to only received emails, rather than sent and received.

@Heaford

This comment has been minimized.

Copy link

Heaford commented Jun 13, 2016

You also need to make sure that "Access for less secure apps has been turned on" inside of Gmail, this stopped it from working for me until I did this.

@sunnyk2057

This comment has been minimized.

Copy link

sunnyk2057 commented Sep 6, 2016

how can we add time and subject filter on the code

@Kentrg11

This comment has been minimized.

Copy link

Kentrg11 commented Nov 29, 2016

Like many here im looking for a way to search specific dates or last 24 hours
Any tips would be appretiated

@imdadhussain

This comment has been minimized.

Copy link

imdadhussain commented Mar 8, 2017

i have login through google account using django web app now i want to attach a file from gmail . it is possible
Any tips would or working code appretiated in advance
thnaks

@footballqq

This comment has been minimized.

Copy link

footballqq commented Mar 19, 2017

thank you~

@maulikparekh2

This comment has been minimized.

Copy link

maulikparekh2 commented Apr 12, 2017

People who are facing "Not able to download all attachments.." error.

One of the reason is, Google's security

You will get a below mail from Google and Click the allowing access to less secure apps Hyperlink and turn On for less secure apps.
Are you the one who tried signing in?
Google will continue to block sign-in attempts from the app you're using because it has known security problems or is out of date. You can continue to use this app by allowing access to less secure apps, but this may leave your account vulnerable.

@ghost

This comment has been minimized.

Copy link

ghost commented Apr 24, 2017

People using python 3.+++, you will have to make slight edits to the print option i.e from print 'Not able to sign in!' to print('Not able to sign in!'), raw_input to the input function i.e input('Enter your password'). The rest works like a charm.

@Jaan4276

This comment has been minimized.

Copy link

Jaan4276 commented Apr 25, 2017

Hi All,
Thanks for your answers,it is very helpful and i need at least one example for download attachments form hotmail(any microsoftmail-without configured in my lappy only from servers) and office 365 accounts and it has two step authentication
Thanks again
Regards
Jaaan

@Jaan4276

This comment has been minimized.

Copy link

Jaan4276 commented Apr 25, 2017

How to authenticate hotmail and live accounts .Please give me an example.

Thanks

@leifulstrup

This comment has been minimized.

Copy link

leifulstrup commented May 1, 2017

I am using Python 3.5 and found I needed to use

mail = email.message_from_bytes(emailBody) # instead of mail = email.message_from_string(emailBody)

to get it working.

@Jaan4276

This comment has been minimized.

Copy link

Jaan4276 commented May 2, 2017

How to authenticate office365 and microsoft accounts through python

@AlManja

This comment has been minimized.

Copy link

AlManja commented May 13, 2017

Anyone got it working for gmx.com? (I don't use google)
If anyone modified it to work it with gmx.com, please share :-)
Just changing form:
imapSession = imaplib.IMAP4_SSL('imap.gmail.com')
to
imapSession = imaplib.IMAP4_SSL('imap.gmx.com')
didn't work

@Omarmaste

This comment has been minimized.

Copy link

Omarmaste commented Jun 5, 2017

hi, i have this error
Not able to download all attachments.

change in line 38 UTF-8
change in line 25 'UNSEEN FROM "XXX@gmail.com"'

but continue this error
Not able to download all attachments.

@MeanderingCode

This comment has been minimized.

Copy link

MeanderingCode commented Aug 9, 2017

For anyone else who stumbled upon this:

  • If you want a label, change line 24 to read res = imapSession.select('<label_here>')
  • Create an "app specific password" for gmail in your general google account settings
  • Make sure your python is version 2, or be prepared to make changes
@MiroslavMurar

This comment has been minimized.

Copy link

MiroslavMurar commented Sep 12, 2017

It does not work, and I dont have idea why.
Even this code is working well
import smtplib

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("Name1", "passwrd")

msg = "HEj"
server.sendmail("Name1", "Name2", msg)
server.quit()

So it should means that gmail is set up well

@vasone

This comment has been minimized.

Copy link

vasone commented Jan 13, 2018

Guys can I ask how you can download attachment from specific person?
What code do I add?
Thank you

@UgoRomi

This comment has been minimized.

Copy link

UgoRomi commented Feb 14, 2018

I'm using it with python 3.6 and it works fine with just a few adjustments:

  • line 14 change "raw_input" to "input"
  • line 24 change "[Gmail]/All Mail" to "inbox" (or whatever label you want)
  • line 38 change "email.message_from_string" to "email.message_from_bytes"
@GBULLR

This comment has been minimized.

Copy link

GBULLR commented Apr 10, 2018

I cannot get this to work.

Ihave done gmail / inbox
string / bytes
etc.

I find the right emails and all of that but still nothing.

get_payload does not seem to do anything.

Suggestions?

Thank you.

@monkeydust

This comment has been minimized.

Copy link

monkeydust commented Apr 18, 2018

Anyone got this to work with gmail recently? Keen on something like this

@nandkishorm

This comment has been minimized.

Copy link

nandkishorm commented Jul 17, 2018

how to filter by date?

@nafitriaulia

This comment has been minimized.

Copy link

nafitriaulia commented Aug 8, 2018

how to change line 38? so it will support UTF-8?

@nafitriaulia

This comment has been minimized.

Copy link

nafitriaulia commented Aug 8, 2018

@lewisde how to change line 38? so it will support UTF-8?

@giorgi1517

This comment has been minimized.

Copy link

giorgi1517 commented Dec 16, 2018

Anyone got this to work with gmail recently? Keen on something like this

Done

@swesko

This comment has been minimized.

Copy link

swesko commented May 17, 2019

keep getting raise EOF parsing error on python 3,X

@MadJayhawk

This comment has been minimized.

Copy link

MadJayhawk commented Aug 12, 2019

Works on Python 3.7 with several changes:

Line 38: mail = email.message_from_bytes(emailBody)

changed the raises to raise Exception("Not able to sign in!"), raise Exception("Error searching Inbox.") and raise Exception("Error fetching mail.")

Line 18: imapSession = imaplib.IMAP4_SSL('imap.gmail.com')

changed userName = input('Enter your GMail username:') to userName = "XXXXXX@gmail.com"

changed passwd = getpass.getpass('Enter your password: ') to passwd = " "xxxx xxxx xxxx xxxx" (had to get an application specific password for this to work. My Gmail password would not work.)

changed detach_dir to .\picture folder/Email Attachments/ to keep the attachments from being saved to current path

@kngeno

This comment has been minimized.

Copy link

kngeno commented Oct 16, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.