Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import email, getpass, imaplib, os
- detach_dir = '.' # directory where to save attachments (default: current)
- user = raw_input("Enter your GMail username:")
- pwd = getpass.getpass("Enter your password: ")
- # connecting to the gmail imap server
- m = imaplib.IMAP4_SSL("imap.gmail.com")
- m.login(user,pwd)
- m.select("[Gmail]/All Mail") # here you a can choose a mail box like INBOX instead
- # use m.list() to get all the mailboxes
- resp, items = m.search(None, "ALL") # you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp)
- items = items[0].split() # getting the mails id
- for emailid in items:
- resp, data = m.fetch(emailid, "(RFC822)") # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you can ask for headers only, etc
- email_body = data[0][1] # getting the mail content
- mail = email.message_from_string(email_body) # parsing the mail content to get a mail object
- #Check if any attachments at all
- if mail.get_content_maintype() != 'multipart':
- continue
- print "["+mail["From"]+"] :" + mail["Subject"]
- # we use walk to create a generator so we can iterate on the parts and forget about the recursive headach
- for part in mail.walk():
- # multipart are just containers, so we skip them
- if part.get_content_maintype() == 'multipart':
- continue
- # is this part an attachment ?
- if part.get('Content-Disposition') is None:
- continue
- filename = part.get_filename()
- counter = 1
- # if there is no filename, we create one with a counter to avoid duplicates
- if not filename:
- filename = 'part-%03d%s' % (counter, 'bin')
- counter += 1
- att_path = os.path.join(detach_dir, filename)
- #Check if its already there
- if not os.path.isfile(att_path) :
- # finally write the stuff
- fp = open(att_path, 'wb')
- fp.write(part.get_payload(decode=True))
- fp.close()
- #!/usr/bin/env python
- """Save all attachments for given gmail account."""
- import os, sys
- from libgmail import GmailAccount
- ga = GmailAccount("[email protected]", "pA$$w0Rd_")
- ga.login()
- # folders: inbox, starred, all, drafts, sent, spam
- for thread in ga.getMessagesByFolder('all', allPages=True):
- for msg in thread:
- sys.stdout.write('.')
- if msg.attachments:
- print "n", msg.id, msg.number, msg.subject, msg.sender
- for att in msg.attachments:
- if att.filename and att.content:
- attdir = os.path.join(thread.id, msg.id)
- if not os.path.isdir(attdir):
- os.makedirs(attdir)
- with open(os.path.join(attdir, att.filename), 'wb') as f:
- f.write(att.content)
- # Creates an array of references to every attachment in your account
- my $messages = $gmail->get_messages();
- my @attachments;
- foreach ( @{ $messages } ) {
- my $email = $gmail->get_indv_email( msg => $_ );
- if ( defined( $email->{ $_->{ 'id' } }->{ 'attachments' } ) ) {
- foreach ( @{ $email->{ $_->{ 'id' } }->{ 'attachments' } } ) {
- push( @attachments, $gmail->get_attachment( attachment => $_ ) );
- if ( $gmail->error() ) {
- print $gmail->error_msg();
- }
- }
- }
- }
- #retrieve specific attachment
- my $msgid = 'F000000000';
- my $attachid = '0.1';
- my $attach_ref = $gmail->get_attachment( attid => $attachid, msgid => $msgid );
- import javax.mail.*
- import java.util.Properties
- String gmailServer
- int gmailPort
- def user, password, LIMIT
- def inboxFolder, root, StartDate, EndDate
- // Downloads all attachments from a gmail mail box as per some criteria
- // to a specific folder
- // Based on code from
- // http://agileice.blogspot.com/2008/10/using-groovy-to-connect-to-gmail.html
- // http://stackoverflow.com/questions/155504/download-mail-attachment-with-java
- //
- // Requires:
- // java mail jars in the class path (mail.jar and activation.jar)
- // openssl, with gmail certificate added to java keystore (see agileice blog)
- //
- // further improvement: maybe findAll could be used to filter messages
- // subject could be added as another criteria
- ////////////////////// <CONFIGURATION> //////////////////////
- // Maximm number of emails to access in case parameter range is too high
- LIMIT = 10000
- // gmail credentials
- gmailServer = "imap.gmail.com"
- gmailPort = 993
- user = "[email protected]"
- password = "gmailpassword"
- // gmail label, or "INBOX" for inbox
- inboxFolder = "finance"
- // local file system where the attachment files need to be stored
- root = "D:\AttachmentStore"
- // date range dd-mm-yyyy
- StartDate= "31-12-2009"
- EndDate = "1-6-2010"
- ////////////////////// </CONFIGURATION> //////////////////////
- StartDate = Date.parse("dd-MM-yyyy", StartDate)
- EndDate = Date.parse("dd-MM-yyyy", EndDate)
- Properties props = new Properties();
- props.setProperty("mail.store.protocol", "imaps");
- props.setProperty("mail.imaps.host", gmailServer);
- props.setProperty("mail.imaps.port", gmailPort.toString());
- props.setProperty("mail.imaps.partialfetch", "false");
- def session = javax.mail.Session.getDefaultInstance(props,null)
- def store = session.getStore("imaps")
- store.connect(gmailServer, user, password)
- int i = 0;
- def folder = store.getFolder(inboxFolder)
- folder.open(Folder.READ_ONLY)
- for(def msg : folder.messages) {
- //if (msg.subject?.contains("bank Statement"))
- println "[$i] From: ${msg.from} Subject: ${msg.subject} -- Received: ${msg.receivedDate}"
- if (msg.receivedDate < StartDate || msg.receivedDate > EndDate) {
- println "Ignoring due to date range"
- continue
- }
- if (msg.content instanceof Multipart) {
- Multipart mp = (Multipart)msg.content;
- for (int j=0; j < mp.count; j++) {
- Part part = mp.getBodyPart(j);
- println " ---- ${part.fileName} ---- ${part.disposition}"
- if (part.disposition?.equalsIgnoreCase(Part.ATTACHMENT)) {
- if (part.content) {
- def name = msg.receivedDate.format("yyyy_MM_dd") + " " + part.fileName
- println "Saving file to $name"
- def f = new File(root, name)
- //f << part.content
- try {
- if (!f.exists())
- f << part.content
- }
- catch (Exception e) {
- println "*** Error *** $e"
- }
- }
- else {
- println "NO Content Found!!"
- }
- }
- }
- }
- if (i++ > LIMIT)
- break;
- }
Add Comment
Please, Sign In to add comment