Wie kann ich alle E-Mails mit Anhängen von Google Mail herunterladen?
83
Wie verbinde ich mich mit Google Mail und stelle fest, welche Nachrichten Anhänge haben? Ich möchte dann jeden Anhang herunterladen und den Betreff: und Von: für jede Nachricht ausdrucken, während ich sie verarbeite.
Auf dieser Website geht es darum, genau definierte Antworten auf genau definierte Fragen zu erhalten. Ist meine Frage nicht genau definiert? Jetzt suche ich nach einer genau definierten Antwort in einer von drei Sprachen, die ich üblicherweise verwende.
Antworten:
154
Schwer :-)
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! Das war etwas ;-) Aber versuche das gleiche in Java, nur zum Spaß!
Übrigens habe ich das in einer Shell getestet, so dass wahrscheinlich einige Fehler bestehen bleiben.
Genießen
BEARBEITEN:
Da sich die Postfachnamen von Land zu Land ändern können, empfehle ich m.list(), zuvor einen Artikel darin m.select("the mailbox name")zu erstellen und auszuwählen , um diesen Fehler zu vermeiden:
imaplib.error: Befehl SEARCH im Status AUTH illegal, nur in den Status SELECTED zulässig
Danke JF Schrieb das wuick und dreckig, du hast ihm Wert gegeben :-D
e-satis
Das ist eine gute Antwort. Es stirbt mit einem Malloc-Fehler bei großen Anhängen. Python (57780) malloc: *** mmap (Größe = 9658368)
Wo im Drehbuch stirbt es? Ich erhalte diesen Fehler nicht, aber wir finden möglicherweise eine Problemumgehung.
E-Satis
imaplib.py lib: (*** Fehler: Region kann nicht zugeordnet werden) error resp, data = m.fetch (emailid, "(RFC822)") # Abrufen der Mail-Datei "/Library/Frameworks/Python.framework/Versions /2.5/lib/python2.5/imaplib.py“, Linie 437, fetch in typ, DAT = self._simple_command (Name, message_set, message_parts)
Wenn Sie dies auf einem hochaktiven System ausführen müssten, wäre es vorzuziehen, jede E-Mail einzeln oder regelmäßig auf einmal zu bearbeiten? Beide Lösungen würden eine Warteschlange erfordern, aber ich frage mich, welche leichter skalierbar wäre.
kari.patila
9
Ich bin kein Experte für Perl, aber ich weiß, dass GMail IMAP und POP3 unterstützt, 2 Protokolle, die vollständig Standard sind und es Ihnen ermöglichen, genau das zu tun.
IMAP Ich würde sagen, dass es für Sicherungszwecke das zuverlässigere der beiden ist.
Kris Kumler
8
#!/usr/bin/env python"""Save all attachments for given gmail account."""import os, sys
from libgmail importGmailAccount
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)
ungetestet
Stellen Sie sicher, dass TOS solche Skripte zulässt, da sonst Ihr Konto gesperrt wird
Möglicherweise gibt es bessere Optionen: GMail-Offline-Modus, Thunderbird + ExtractExtensions, GmailFS, Gmail Drive usw.
In Google Mail können Sie nach "has: Anhang" filtern und damit die Nachrichten identifizieren, die Sie beim Testen erhalten sollten. Beachten Sie, dass dies sowohl Nachrichten mit angehängten Dateien (Büroklammersymbol angezeigt) als auch inline angehängte Bilder (keine Büroklammer angezeigt) enthält.
Dieses PHP-Beispiel kann auch helfen. Nach dem, was ich sehen kann, sind im imap_header leider keine Anhangsinformationen enthalten, sodass das Herunterladen des Körpers erforderlich ist, um das Feld X-Anhang-ID sehen zu können. (Jemand, bitte beweise mir das Gegenteil).
Wenn einer von Ihnen auf Python 3.3 aktualisiert hat, habe ich das 2.7-Skript von HIER genommen und auf 3.3 aktualisiert. Außerdem wurden einige Probleme mit der Art und Weise behoben, in der Google Mail die Informationen zurückgab.
# 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)
Die Frage ist ziemlich alt und zu diesem Zeitpunkt war die Google Mail-API nicht verfügbar. Aber jetzt bietet Google die Google Mail-API für den Zugriff auf IMAP. Siehe Googles Gmail API hier . Siehe auch google-api-python-client auf pypi.
@ Jechaviz Ich bekomme unbekannte Host-Ausnahme immer bitte helfen
Rahul Singh
1
Da Google Mail die Standardprotokolle POP und IMAP unterstützt, sollte jede Plattform, jedes Tool, jede Anwendung, jede Komponente oder API funktionieren, die die Clientseite beider Protokolle bereitstellt.
Ich schlage vor, eine Google-Suche nach Ihrer Lieblingssprache / -plattform (z. B. "Python") sowie "Pop", "Imap" und möglicherweise "Open Source" sowie "Download" oder "Review" durchzuführen und zu sehen, was passiert Sie erhalten für Optionen.
Es gibt zahlreiche kostenlose Anwendungen und Komponenten. Wählen Sie einige aus, die es wert erscheinen, suchen Sie nach Bewertungen, laden Sie sie herunter und genießen Sie sie.
Sie sollten sich der Tatsache bewusst sein, dass Sie SSL benötigen, um eine Verbindung zu GMail herzustellen (sowohl für POP3 als auch für IMAP - dies gilt natürlich auch für deren SMTP-Server, abgesehen von Port 25, aber das ist eine andere Geschichte).
Folgendes habe ich geschrieben, um meine Kontoauszüge in Groovy (dynamische Sprache für die Java-Plattform) herunterzuladen .
import javax.mail.*import java.util.PropertiesString 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-yyyyStartDate="31-12-2009"EndDate="1-6-2010"////////////////////// </CONFIGURATION> //////////////////////StartDate=Date.parse("dd-MM-yyyy",StartDate)EndDate=Date.parse("dd-MM-yyyy",EndDate)Properties props =newProperties();
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 instanceofMultipart){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 =newFile(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;}
Für Java finden Sie G4J von Nutzen. Es handelt sich um eine Reihe von APIs für die Kommunikation mit Google Mail über Java (der Screenshot auf der Startseite ist ein Demonstrations-E-Mail-Client, der darauf aufbaut).
Antworten:
Schwer :-)
Wowww! Das war etwas ;-) Aber versuche das gleiche in Java, nur zum Spaß!
Übrigens habe ich das in einer Shell getestet, so dass wahrscheinlich einige Fehler bestehen bleiben.
Genießen
BEARBEITEN:
Da sich die Postfachnamen von Land zu Land ändern können, empfehle ich
m.list()
, zuvor einen Artikel darinm.select("the mailbox name")
zu erstellen und auszuwählen , um diesen Fehler zu vermeiden:quelle
Ich bin kein Experte für Perl, aber ich weiß, dass GMail IMAP und POP3 unterstützt, 2 Protokolle, die vollständig Standard sind und es Ihnen ermöglichen, genau das zu tun.
Vielleicht hilft Ihnen das beim Einstieg.
quelle
ungetestet
quelle
Schauen Sie sich Mail :: Webmail :: Gmail an :
ANHÄNGE ERHALTEN
Es gibt zwei Möglichkeiten, einen Anhang zu erhalten:
1 -> Durch Senden eines Verweises auf einen bestimmten Anhang, der von zurückgegeben wird
get_indv_email
2 -> Oder durch Senden der Anhangs-ID und der Nachrichten-ID
(Gibt einen Verweis auf einen Skalar zurück, der die Daten aus dem Anhang enthält.)
quelle
In Google Mail können Sie nach "has: Anhang" filtern und damit die Nachrichten identifizieren, die Sie beim Testen erhalten sollten. Beachten Sie, dass dies sowohl Nachrichten mit angehängten Dateien (Büroklammersymbol angezeigt) als auch inline angehängte Bilder (keine Büroklammer angezeigt) enthält.
Es gibt keine Google Mail-API, daher sind IMAP oder POP Ihre einzigen echten Optionen. Die JavaMail-API kann ebenso hilfreich sein wie dieser sehr knappe Artikel zum Herunterladen von Anhängen von IMAP mit Perl . Einige frühere Fragen hier zu SO können ebenfalls hilfreich sein.
Dieses PHP-Beispiel kann auch helfen. Nach dem, was ich sehen kann, sind im imap_header leider keine Anhangsinformationen enthalten, sodass das Herunterladen des Körpers erforderlich ist, um das Feld X-Anhang-ID sehen zu können. (Jemand, bitte beweise mir das Gegenteil).
quelle
Wenn einer von Ihnen auf Python 3.3 aktualisiert hat, habe ich das 2.7-Skript von HIER genommen und auf 3.3 aktualisiert. Außerdem wurden einige Probleme mit der Art und Weise behoben, in der Google Mail die Informationen zurückgab.
quelle
Die Frage ist ziemlich alt und zu diesem Zeitpunkt war die Google Mail-API nicht verfügbar. Aber jetzt bietet Google die Google Mail-API für den Zugriff auf IMAP. Siehe Googles Gmail API hier . Siehe auch google-api-python-client auf pypi.
quelle
Maven-Abhängigkeit:
quelle
Da Google Mail die Standardprotokolle POP und IMAP unterstützt, sollte jede Plattform, jedes Tool, jede Anwendung, jede Komponente oder API funktionieren, die die Clientseite beider Protokolle bereitstellt.
Ich schlage vor, eine Google-Suche nach Ihrer Lieblingssprache / -plattform (z. B. "Python") sowie "Pop", "Imap" und möglicherweise "Open Source" sowie "Download" oder "Review" durchzuführen und zu sehen, was passiert Sie erhalten für Optionen.
Es gibt zahlreiche kostenlose Anwendungen und Komponenten. Wählen Sie einige aus, die es wert erscheinen, suchen Sie nach Bewertungen, laden Sie sie herunter und genießen Sie sie.
quelle
Sie sollten sich der Tatsache bewusst sein, dass Sie SSL benötigen, um eine Verbindung zu GMail herzustellen (sowohl für POP3 als auch für IMAP - dies gilt natürlich auch für deren SMTP-Server, abgesehen von Port 25, aber das ist eine andere Geschichte).
quelle
Folgendes habe ich geschrieben, um meine Kontoauszüge in Groovy (dynamische Sprache für die Java-Plattform) herunterzuladen .
quelle
Haben Sie sich die GMail-Add-Ons von Drittanbietern auf Wikipedia angesehen?
Insbesondere ist PhpGmailDrive ein Open-Source-Add-On, das Sie möglicherweise unverändert verwenden oder vielleicht als Inspiration verwenden können.
quelle
Für Java finden Sie G4J von Nutzen. Es handelt sich um eine Reihe von APIs für die Kommunikation mit Google Mail über Java (der Screenshot auf der Startseite ist ein Demonstrations-E-Mail-Client, der darauf aufbaut).
quelle