Jak mogę pobrać wszystkie e-maile z załącznikami z Gmaila?
83
Jak połączyć się z Gmailem i określić, które wiadomości mają załączniki? Następnie chcę pobrać każdy załącznik, drukując Temat: i Od: dla każdej wiadomości w trakcie jej przetwarzania.
Ta strona ma na celu uzyskanie dobrze zdefiniowanych odpowiedzi na dobrze zdefiniowane pytania. Czy moje pytanie nie jest dobrze zdefiniowane? Teraz szukam dobrze zdefiniowanej odpowiedzi w jednym z 3 języków, których często używam.
Odpowiedzi:
154
Ciężki przypadek :-)
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()
Wowww! To było coś. ;-) Ale spróbuj tego samego w Javie, dla zabawy!
Swoją drogą, przetestowałem to w powłoce, więc prawdopodobnie pozostaną pewne błędy.
Cieszyć się
EDYTOWAĆ:
Ponieważ nazwy skrzynek pocztowych mogą się zmieniać z jednego kraju do drugiego, zalecamy zrobienie m.list()i wybranie pozycji w niej wcześniej, m.select("the mailbox name")aby uniknąć tego błędu:
imaplib.error: polecenie SEARCH jest niedozwolone w stanie AUTH, dozwolone tylko w stanach WYBRANY
Dzięki JF Napisał to wuick and dirty, dałeś mu wartość :-D
e-satis
To jest dobra odpowiedź. Umiera z błędem malloc na dużych załącznikach. Python (57780) malloc: *** mmap (size = 9658368)
Gdzie w scenariuszu umiera? Nie widzę tego błędu, ale możemy znaleźć obejście.
e-satis
imaplib.py lib: (*** błąd: nie można przydzielić regionu) błąd resp, data = m.fetch (emailid, "(RFC822)") # pobieranie pliku poczty "/Library/Frameworks/Python.framework/Versions /2.5/lib/python2.5/imaplib.py ", wiersz 437, w pobieraniu typ, dat = self._simple_command (name, message_set, message_parts)
Gdybyś musiał to uruchomić w bardzo aktywnym systemie, czy lepiej byłoby obsługiwać każdą wiadomość e-mail osobno, czy też okresowo i wszystkie naraz? Oba rozwiązania wymagałyby kolejki, ale zastanawiam się, które z nich byłoby łatwiej skalowalne?
kari.patila
9
Nie jestem ekspertem od Perla, ale wiem, że GMail obsługuje IMAP i POP3, 2 protokoły, które są całkowicie standardowe i pozwalają ci to zrobić.
IMAP Powiedziałbym, że jest bardziej niezawodny z dwóch do celów tworzenia kopii zapasowych.
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)
withopen(os.path.join(attdir, att.filename), 'wb') as f:
f.write(att.content)
niesprawdzone
Upewnij się, że TOS zezwala na takie skrypty, w przeciwnym razie Twoje konto zostanie zawieszone
Mogą być lepsze opcje: tryb offline Gmaila, Thunderbird + ExtractExtensions, GmailFS, Gmail Drive itp.
W Gmailu możesz filtrować dane „ma: załącznik” i używać go do identyfikowania wiadomości, które powinieneś otrzymywać podczas testowania. Zauważ, że wydaje się, że zawiera ona zarówno wiadomości z załączonymi plikami (pokazana ikona spinacza), jak i załączone obrazy w tekście (brak pokazanego spinacza).
Ten przykład PHP może również pomóc. Niestety z tego, co widzę, nie ma informacji o załącznikach zawartych w imap_header, więc pobranie treści jest wymagane, aby zobaczyć pole X-Attachment-Id. (niech ktoś udowodni, że się mylę).
Jeśli ktoś z was zaktualizował pythona do wersji 3.3, wziąłem skrypt 2.7 z TUTAJ i zaktualizowałem go do wersji 3.3. Naprawiono też niektóre problemy ze sposobem, w jaki Gmail zwracał informacje.
# 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()
ifbool(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)
Pytanie jest dość stare i wtedy Gmail API nie był dostępny. Ale teraz Google zapewnia Gmail API, aby uzyskać dostęp do IMAP. Zobacz interfejs API Gmaila Google tutaj . Zobacz także google-api-python-client na pypi.
@jechaviz Otrzymuję wyjątek nieznanego gospodarza, zawsze proszę o pomoc
Rahul Singh
1
Ponieważ Gmail obsługuje standardowe protokoły POP i IMAP, każda platforma, narzędzie, aplikacja, komponent lub interfejs API, które zapewniają obsługę obu protokołów po stronie klienta, powinny działać.
Proponuję poszukać w Google Twojego ulubionego języka / platformy (np. „Python”), plus „pop”, plus „imap” plus być może „open source” plus być może „download” lub „review”, i zobacz, co dostajesz za opcje.
Istnieje wiele bezpłatnych aplikacji i komponentów, wybierz kilka, które wydają się godne, sprawdź recenzje, a następnie pobierz i ciesz się.
Powinieneś być świadomy faktu, że potrzebujesz SSL, aby połączyć się z Gmailem (zarówno dla POP3, jak i IMAP - dotyczy to oczywiście również ich serwerów SMTP poza portem 25, ale to już inna historia).
Oto coś, co napisałem, aby pobrać wyciągi bankowe w Groovy (język dynamiczny dla platformy 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;
}
W szczególności PhpGmailDrive to dodatek typu open source, z którego możesz korzystać w obecnym kształcie , a może studiować w poszukiwaniu inspiracji?
W przypadku Javy znajdziesz G4J . To zestaw interfejsów API do komunikacji z Google Mail za pośrednictwem języka Java (zrzut ekranu na stronie głównej to demonstracyjny klient poczty e-mail zbudowany wokół tego)
Odpowiedzi:
Ciężki przypadek :-)
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()
Wowww! To było coś. ;-) Ale spróbuj tego samego w Javie, dla zabawy!
Swoją drogą, przetestowałem to w powłoce, więc prawdopodobnie pozostaną pewne błędy.
Cieszyć się
EDYTOWAĆ:
Ponieważ nazwy skrzynek pocztowych mogą się zmieniać z jednego kraju do drugiego, zalecamy zrobienie
m.list()
i wybranie pozycji w niej wcześniej,m.select("the mailbox name")
aby uniknąć tego błędu:źródło
Nie jestem ekspertem od Perla, ale wiem, że GMail obsługuje IMAP i POP3, 2 protokoły, które są całkowicie standardowe i pozwalają ci to zrobić.
Może to pomoże ci zacząć.
źródło
#!/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)
niesprawdzone
źródło
Spójrz na Mail :: Webmail :: Gmail :
POBIERANIE ZAŁĄCZNIKÓW
Istnieją dwa sposoby uzyskania załącznika:
1 -> Wysyłając odniesienie do konkretnego załącznika zwróconego przez
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 -> Lub wysyłając identyfikator załącznika i identyfikator wiadomości
#retrieve specific attachment my $msgid = 'F000000000'; my $attachid = '0.1'; my $attach_ref = $gmail->get_attachment( attid => $attachid, msgid => $msgid );
(Zwraca odniesienie do wartości skalarnej, która przechowuje dane z załącznika).
źródło
W Gmailu możesz filtrować dane „ma: załącznik” i używać go do identyfikowania wiadomości, które powinieneś otrzymywać podczas testowania. Zauważ, że wydaje się, że zawiera ona zarówno wiadomości z załączonymi plikami (pokazana ikona spinacza), jak i załączone obrazy w tekście (brak pokazanego spinacza).
Nie ma interfejsu Gmail API, więc IMAP lub POP to jedyne prawdziwe opcje. JavaMail API może być pomocne, jak to bardzo zwięzły artykuł na temat pobierania załączników z IMAP przy użyciu Perl . Pomocne mogą być również niektóre wcześniejsze pytania dotyczące SO.
Ten przykład PHP może również pomóc. Niestety z tego, co widzę, nie ma informacji o załącznikach zawartych w imap_header, więc pobranie treści jest wymagane, aby zobaczyć pole X-Attachment-Id. (niech ktoś udowodni, że się mylę).
źródło
Jeśli ktoś z was zaktualizował pythona do wersji 3.3, wziąłem skrypt 2.7 z TUTAJ i zaktualizowałem go do wersji 3.3. Naprawiono też niektóre problemy ze sposobem, w jaki Gmail zwracał informacje.
# 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)
źródło
Pytanie jest dość stare i wtedy Gmail API nie był dostępny. Ale teraz Google zapewnia Gmail API, aby uzyskać dostęp do IMAP. Zobacz interfejs API Gmaila Google tutaj . Zobacz także google-api-python-client na pypi.
źródło
/*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); } }
Zależność Mavena:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.1</version> </dependency>
źródło
Ponieważ Gmail obsługuje standardowe protokoły POP i IMAP, każda platforma, narzędzie, aplikacja, komponent lub interfejs API, które zapewniają obsługę obu protokołów po stronie klienta, powinny działać.
Proponuję poszukać w Google Twojego ulubionego języka / platformy (np. „Python”), plus „pop”, plus „imap” plus być może „open source” plus być może „download” lub „review”, i zobacz, co dostajesz za opcje.
Istnieje wiele bezpłatnych aplikacji i komponentów, wybierz kilka, które wydają się godne, sprawdź recenzje, a następnie pobierz i ciesz się.
źródło
Powinieneś być świadomy faktu, że potrzebujesz SSL, aby połączyć się z Gmailem (zarówno dla POP3, jak i IMAP - dotyczy to oczywiście również ich serwerów SMTP poza portem 25, ale to już inna historia).
źródło
Oto coś, co napisałem, aby pobrać wyciągi bankowe w Groovy (język dynamiczny dla platformy 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; }
źródło
Czy przyjrzałeś się dodatkom innych firm do Gmaila na Wikipedii?
W szczególności PhpGmailDrive to dodatek typu open source, z którego możesz korzystać w obecnym kształcie , a może studiować w poszukiwaniu inspiracji?
źródło
W przypadku Javy znajdziesz G4J . To zestaw interfejsów API do komunikacji z Google Mail za pośrednictwem języka Java (zrzut ekranu na stronie głównej to demonstracyjny klient poczty e-mail zbudowany wokół tego)
źródło