Skip to content

Instantly share code, notes, and snippets.

@baali
Created May 8, 2012 08:32
Show Gist options
  • Save baali/2633554 to your computer and use it in GitHub Desktop.
Save baali/2633554 to your computer and use it in GitHub Desktop.
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.'
@vasone
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
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
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
Copy link

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

@nandkishorm
Copy link

how to filter by date?

@nafitriaulia
Copy link

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

@nafitriaulia
Copy link

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

@giorgiberia
Copy link

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

Done

@swesko
Copy link

swesko commented May 17, 2019

keep getting raise EOF parsing error on python 3,X

@MadJayhawk
Copy link

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

kngeno commented Oct 16, 2019

@Aths23
Copy link

Aths23 commented Apr 6, 2020

Amazing Working Script Thanks To @baali

@x011
Copy link

x011 commented Apr 22, 2020

@Saifriyami
Copy link

Dears
usful code to check old pictures, thanks, however
When I ran the code it printed the email username and did not do anything more.

@nickgreen43
Copy link

This is awesome! Thank you

@chaohuichen
Copy link

Hi,
Does anyone find this repo working? I think I am stuck with the login that throws me exception

typ, accountDetails = imapSession.login(userName, passed)

can anyone help?

thank you

@kngeno
Copy link

kngeno commented Apr 3, 2021

Hi @chaohuichen,

Have you tried this? https://gist.github.com/kngeno/5337e543eb72174a6ac95e028b3b6456

Also from @x011on flagging particular emails
https://gist.github.com/x011/d6c346debe22f5fec9e4499643ae1050

Hi,
Does anyone find this repo working? I think I am stuck with the login that throws me exception

typ, accountDetails = imapSession.login(userName, passed)

can anyone help?

thank you

@chaohuichen
Copy link

Hi @chaohuichen,

Have you tried this? https://gist.github.com/kngeno/5337e543eb72174a6ac95e028b3b6456

Also from @x011on flagging particular emails
https://gist.github.com/x011/d6c346debe22f5fec9e4499643ae1050

Hi,
Does anyone find this repo working? I think I am stuck with the login that throws me exception
typ, accountDetails = imapSession.login(userName, passed)
can anyone help?
thank you

Thank you @kngeno. the second gist link works!

@os835
Copy link

os835 commented Dec 27, 2022

Trying this in 2022 and always getting the 'Not able to download all attachments.' error. I read that in May 2022 google does not give the options to allow access to less secure apps, which fixed the problem for other users here. Does anyone know how to make this work in 2022?

Any help is much appreciated. Thanks!

@giorgiberia
Copy link

Trying this in 2022 and always getting the 'Not able to download all attachments.' error. I read that in May 2022 google does not give the options to allow access to less secure apps, which fixed the problem for other users here. Does anyone know how to make this work in 2022?

Any help is much appreciated. Thanks!

If mail is something like test@test.com
Less secured app option is still available

For mails like anything@gmail.com you should use "app password"

@os835
Copy link

os835 commented Dec 27, 2022

Thanks for the reply! For App password, would I just use it in place of the regular password in the script above?

I tried that but am still getting the same issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment