¿Cómo puedo descargar todos los correos electrónicos con archivos adjuntos de Gmail?
83
¿Cómo me conecto a Gmail y determino qué mensajes tienen archivos adjuntos? Luego quiero descargar cada archivo adjunto, imprimiendo el Asunto: y De: para cada mensaje a medida que lo proceso.
Este sitio trata de obtener respuestas bien definidas a preguntas bien definidas. ¿Mi pregunta no está bien definida? Ahora busco una respuesta bien definida en uno de los 3 idiomas que uso habitualmente.
Respuestas:
154
Difícil :-)
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 idfor 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 allif mail.get_content_maintype() != 'multipart':
continueprint"["+mail["From"]+"] :" + mail["Subject"]
# we use walk to create a generator so we can iterate on the parts and forget about the recursive headachfor part in mail.walk():
# multipart are just containers, so we skip themif part.get_content_maintype() == 'multipart':
continue# is this part an attachment ?if part.get('Content-Disposition') isNone:
continue
filename = part.get_filename()
counter = 1# if there is no filename, we create one with a counter to avoid duplicatesifnot filename:
filename = 'part-%03d%s' % (counter, 'bin')
counter += 1
att_path = os.path.join(detach_dir, filename)
#Check if its already thereifnot os.path.isfile(att_path) :
# finally write the stuff
fp = open(att_path, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
¡Vaya! Eso fue algo. ;-) ¡Pero prueba lo mismo en Java, solo por diversión!
Por cierto, probé eso en un shell, por lo que es probable que persistan algunos errores.
Disfrutar
EDITAR:
Debido a que los nombres de los buzones de correo pueden cambiar de un país a otro, recomiendo hacer m.list()y elegir un artículo antes m.select("the mailbox name")para evitar este error:
imaplib.error: comando SEARCH ilegal en el estado AUTH, solo permitido en los estados SELECTED
Gracias JF Escribió eso sucio y sucio, le diste valor :-D
e-satis
Esta es una buena respuesta. Muere con un error de malloc en archivos adjuntos grandes. Python (57780) malloc: *** mmap (tamaño = 9658368)
¿En qué parte del guión muere? No recibo este error, pero es posible que encontremos una solución.
e-satis
imaplib.py lib: (*** error: no se puede asignar la región) error resp, data = m.fetch (emailid, "(RFC822)") # obteniendo el archivo de correo "/Library/Frameworks/Python.framework/Versions /2.5/lib/python2.5/imaplib.py ", línea 437, en fetch typ, dat = self._simple_command (name, message_set, message_parts)
Si tuviera que ejecutar esto en un sistema muy activo, ¿sería preferible manejar cada correo electrónico por separado o periódicamente todos a la vez? Ambas soluciones requerirían una cola, pero me pregunto cuál sería más fácilmente escalable.
kari.patila
9
No soy un experto en Perl, pero lo que sí sé es que GMail admite IMAP y POP3, 2 protocolos que son completamente estándar y le permiten hacer precisamente eso.
IMAP Yo diría que es el más confiable de los dos para fines de respaldo.
Kris Kumler
8
#!/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, spamfor 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)
ifnot os.path.isdir(attdir):
os.makedirs(attdir)
with open(os.path.join(attdir, att.filename), 'wb') as f:
f.write(att.content)
no probado
Asegúrese de que TOS permita tales scripts, de lo contrario su cuenta será suspendida
Puede haber mejores opciones: modo fuera de línea de GMail, Thunderbird + ExtractExtensions, GmailFS, Gmail Drive, etc.
Dentro de gmail, puede filtrar por "tiene: archivo adjunto", utilícelo para identificar los mensajes que debería recibir durante la prueba. Tenga en cuenta que esto parece dar ambos mensajes con archivos adjuntos (se muestra el icono de clip), así como imágenes adjuntas en línea (no se muestra ningún clip).
Este ejemplo de PHP también puede ayudar. Desafortunadamente, por lo que puedo ver, no hay información adjunta contenida en imap_header, por lo que es necesario descargar el cuerpo para poder ver el campo X-Attachment-Id. (alguien por favor demuestre que estoy equivocado).
Si alguno de ustedes ha actualizado a Python 3.3, tomé el script 2.7 de AQUÍ y lo actualicé a 3.3. También se corrigieron algunos problemas con la forma en que gmail devolvía la información.
# 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.# Gmail as of now returns in bytes but just in case they go back to string this line is left here.import email
import getpass, imaplib
import os
import sys
import time
detach_dir = '.'if'attachments'notin os.listdir(detach_dir):
os.mkdir('attachments')
userName = input('Enter your GMail username:\n')
passwd = getpass.getpass('Enter your password:\n')
try:
imapSession = imaplib.IMAP4_SSL('imap.gmail.com',993)
typ, accountDetails = imapSession.login(userName, passwd)
if typ != 'OK':
print ('Not able to sign in!')
raise
imapSession.select('Inbox')
typ, data = imapSession.search(None, 'ALL')
if typ != 'OK':
print ('Error searching Inbox.')
raise# Iterating over all emailsfor msgId in data[0].split():
typ, messageParts = imapSession.fetch(msgId, '(RFC822)')
if typ != 'OK':
print ('Error fetching mail.')
raise#print(type(emailBody))
emailBody = messageParts[0][1]
#mail = email.message_from_string(emailBody)
mail = email.message_from_bytes(emailBody)
for part in mail.walk():
#print (part)if part.get_content_maintype() == 'multipart':
# print part.as_string()continueif part.get('Content-Disposition') isNone:
# print part.as_string()continue
fileName = part.get_filename()
if bool(fileName):
filePath = os.path.join(detach_dir, 'attachments', fileName)
ifnot 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.')
time.sleep(3)
La pregunta es bastante antigua y en ese momento la API de Gmail no estaba disponible. Pero ahora Google proporciona la API de Gmail para acceder a IMAP. Consulte la API de Gmail de Google aquí . Consulte también google-api-python-client en pypi.
@jechaviz, recibo una excepción de host desconocido, por favor, ayude siempre
Rahul Singh
1
Dado que Gmail admite los protocolos estándar POP e IMAP, cualquier plataforma, herramienta, aplicación, componente o API que proporcione el lado del cliente de cualquiera de los protocolos debería funcionar.
Sugiero hacer una búsqueda en Google de su idioma / plataforma favorita (por ejemplo, "python"), más "pop", más "imap", más quizás "open source", más quizás "download" o "review", y vea qué obtienes por opciones.
Existen numerosas aplicaciones y componentes gratuitos, elija algunos que parezcan dignos, compruebe las revisiones, luego descárguelos y disfrútelos.
Debe tener en cuenta el hecho de que necesita SSL para conectarse a GMail (tanto para POP3 como para IMAP; esto, por supuesto, también es cierto para sus servidores SMTP, aparte del puerto 25, pero esa es otra historia).
Aquí hay algo que escribí para descargar mis extractos bancarios en Groovy (lenguaje dinámico para la plataforma Java).
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.contenttry {
if (!f.exists())
f << part.content
}
catch (Exception e) {
println "*** Error *** $e"
}
}
else {
println "NO Content Found!!"
}
}
}
}
if (i++ > LIMIT)
break;
}
Para Java, encontrará G4J útil. Es un conjunto de API para comunicarse con Google Mail a través de Java (la captura de pantalla en la página de inicio es un cliente de correo electrónico de demostración creado en torno a esto)
Respuestas:
Difícil :-)
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()
¡Vaya! Eso fue algo. ;-) ¡Pero prueba lo mismo en Java, solo por diversión!
Por cierto, probé eso en un shell, por lo que es probable que persistan algunos errores.
Disfrutar
EDITAR:
Debido a que los nombres de los buzones de correo pueden cambiar de un país a otro, recomiendo hacer
m.list()
y elegir un artículo antesm.select("the mailbox name")
para evitar este error:fuente
No soy un experto en Perl, pero lo que sí sé es que GMail admite IMAP y POP3, 2 protocolos que son completamente estándar y le permiten hacer precisamente eso.
Quizás eso te ayude a empezar.
fuente
#!/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)
no probado
fuente
Eche un vistazo a Mail :: Webmail :: Gmail :
OBTENER ADJUNTOS
Hay dos formas de obtener un archivo adjunto:
1 -> Al enviar una referencia a un adjunto específico devuelto por
get_indv_email
# 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(); } } } }
2 -> O enviando el ID del adjunto y el ID del mensaje
#retrieve specific attachment my $msgid = 'F000000000'; my $attachid = '0.1'; my $attach_ref = $gmail->get_attachment( attid => $attachid, msgid => $msgid );
(Devuelve una referencia a un escalar que contiene los datos del archivo adjunto).
fuente
Dentro de gmail, puede filtrar por "tiene: archivo adjunto", utilícelo para identificar los mensajes que debería recibir durante la prueba. Tenga en cuenta que esto parece dar ambos mensajes con archivos adjuntos (se muestra el icono de clip), así como imágenes adjuntas en línea (no se muestra ningún clip).
No hay API de Gmail, por lo que IMAP o POP son sus únicas opciones reales. La API de JavaMail puede ser de alguna ayuda, así como este artículo muy conciso sobre la descarga de archivos adjuntos de IMAP usando Perl . Algunas preguntas anteriores aquí sobre SO también pueden ayudar.
Este ejemplo de PHP también puede ayudar. Desafortunadamente, por lo que puedo ver, no hay información adjunta contenida en imap_header, por lo que es necesario descargar el cuerpo para poder ver el campo X-Attachment-Id. (alguien por favor demuestre que estoy equivocado).
fuente
Si alguno de ustedes ha actualizado a Python 3.3, tomé el script 2.7 de AQUÍ y lo actualicé a 3.3. También se corrigieron algunos problemas con la forma en que gmail devolvía la información.
# 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. # Gmail as of now returns in bytes but just in case they go back to string this line is left here. import email import getpass, imaplib import os import sys import time detach_dir = '.' if 'attachments' not in os.listdir(detach_dir): os.mkdir('attachments') userName = input('Enter your GMail username:\n') passwd = getpass.getpass('Enter your password:\n') try: imapSession = imaplib.IMAP4_SSL('imap.gmail.com',993) typ, accountDetails = imapSession.login(userName, passwd) if typ != 'OK': print ('Not able to sign in!') raise imapSession.select('Inbox') 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 #print(type(emailBody)) emailBody = messageParts[0][1] #mail = email.message_from_string(emailBody) mail = email.message_from_bytes(emailBody) for part in mail.walk(): #print (part) 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.') time.sleep(3)
fuente
La pregunta es bastante antigua y en ese momento la API de Gmail no estaba disponible. Pero ahora Google proporciona la API de Gmail para acceder a IMAP. Consulte la API de Gmail de Google aquí . Consulte también google-api-python-client en pypi.
fuente
/*based on http://www.codejava.net/java-ee/javamail/using-javamail-for-searching-e-mail-messages*/ package getMailsWithAtt; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Part; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.MimeBodyPart; import javax.mail.search.AndTerm; import javax.mail.search.SearchTerm; import javax.mail.search.ReceivedDateTerm; import javax.mail.search.ComparisonTerm; public class EmailReader { private String saveDirectory; /** * Sets the directory where attached files will be stored. * * @param dir * absolute path of the directory */ public void setSaveDirectory(String dir) { this.saveDirectory = dir; } /** * Downloads new messages and saves attachments to disk if any. * * @param host * @param port * @param userName * @param password * @throws IOException */ public void downloadEmailAttachments(String host, String port, String userName, String password, Date startDate, Date endDate) { Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); try { Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("imap.gmail.com", userName, password); // ... Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); SearchTerm olderThan = new ReceivedDateTerm (ComparisonTerm.LT, startDate); SearchTerm newerThan = new ReceivedDateTerm (ComparisonTerm.GT, endDate); SearchTerm andTerm = new AndTerm(olderThan, newerThan); //Message[] arrayMessages = inbox.getMessages(); <--get all messages Message[] arrayMessages = inbox.search(andTerm); for (int i = arrayMessages.length; i > 0; i--) { //from newer to older Message msg = arrayMessages[i-1]; Address[] fromAddress = msg.getFrom(); String from = fromAddress[0].toString(); String subject = msg.getSubject(); String sentDate = msg.getSentDate().toString(); String receivedDate = msg.getReceivedDate().toString(); String contentType = msg.getContentType(); String messageContent = ""; // store attachment file name, separated by comma String attachFiles = ""; if (contentType.contains("multipart")) { // content may contain attachments Multipart multiPart = (Multipart) msg.getContent(); int numberOfParts = multiPart.getCount(); for (int partCount = 0; partCount < numberOfParts; partCount++) { MimeBodyPart part = (MimeBodyPart) multiPart .getBodyPart(partCount); if (Part.ATTACHMENT.equalsIgnoreCase(part .getDisposition())) { // this part is attachment String fileName = part.getFileName(); attachFiles += fileName + ", "; part.saveFile(saveDirectory + File.separator + fileName); } else { // this part may be the message content messageContent = part.getContent().toString(); } } if (attachFiles.length() > 1) { attachFiles = attachFiles.substring(0, attachFiles.length() - 2); } } else if (contentType.contains("text/plain") || contentType.contains("text/html")) { Object content = msg.getContent(); if (content != null) { messageContent = content.toString(); } } // print out details of each message System.out.println("Message #" + (i + 1) + ":"); System.out.println("\t From: " + from); System.out.println("\t Subject: " + subject); System.out.println("\t Received: " + sentDate); System.out.println("\t Message: " + messageContent); System.out.println("\t Attachments: " + attachFiles); } // disconnect inbox.close(false); store.close(); } catch (NoSuchProviderException e) { e.printStackTrace(); System.exit(1); } catch (MessagingException e) { e.printStackTrace(); System.exit(2); } catch (IOException ex) { ex.printStackTrace(); } } /** * Runs this program with Gmail POP3 server * @throws ParseException */ public static void main(String[] args) throws ParseException { String host = "pop.gmail.com"; String port = "995"; String userName = "[email protected]"; String password = "pass"; Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2014-06-30"); Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse("2014-06-01"); String saveDirectory = "C:\\Temp"; EmailReader receiver = new EmailReader(); receiver.setSaveDirectory(saveDirectory); receiver.downloadEmailAttachments(host, port, userName, password,startDate,endDate); } }
Dependencia de Maven:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.1</version> </dependency>
fuente
Dado que Gmail admite los protocolos estándar POP e IMAP, cualquier plataforma, herramienta, aplicación, componente o API que proporcione el lado del cliente de cualquiera de los protocolos debería funcionar.
Sugiero hacer una búsqueda en Google de su idioma / plataforma favorita (por ejemplo, "python"), más "pop", más "imap", más quizás "open source", más quizás "download" o "review", y vea qué obtienes por opciones.
Existen numerosas aplicaciones y componentes gratuitos, elija algunos que parezcan dignos, compruebe las revisiones, luego descárguelos y disfrútelos.
fuente
Debe tener en cuenta el hecho de que necesita SSL para conectarse a GMail (tanto para POP3 como para IMAP; esto, por supuesto, también es cierto para sus servidores SMTP, aparte del puerto 25, pero esa es otra historia).
fuente
Aquí hay algo que escribí para descargar mis extractos bancarios en Groovy (lenguaje dinámico para la plataforma Java).
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; }
fuente
¿Ha echado un vistazo a los complementos de terceros de GMail en wikipedia?
En particular, PhpGmailDrive es un complemento de código abierto que puede usar tal cual, o quizás estudiar para inspirarse.
fuente
Para Java, encontrará G4J útil. Es un conjunto de API para comunicarse con Google Mail a través de Java (la captura de pantalla en la página de inicio es un cliente de correo electrónico de demostración creado en torno a esto)
fuente