Hoe kan ik alle e-mails met bijlagen uit Gmail downloaden?

Hoe maak ik verbinding met Gmail en bepaal ik welke berichten bijlagen hebben? Ik wil dan elke bijlage downloaden en het Onderwerp: en Van: voor elk bericht afdrukken terwijl ik het verwerk.


Antwoord 1, autoriteit 100%

Moeilijke 🙂

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()

Wauw! Dat was iets. 😉 Maar probeer hetzelfde in Java, gewoon voor de lol!

Trouwens, ik heb dat in een shell getest, dus er blijven waarschijnlijk nog wat fouten over.

Geniet

BEWERKEN:

Omdat de namen van mailboxen van land tot land kunnen veranderen, raad ik aan om m.list()te doen en een item erin te kiezen vóór m.select("the mailbox name")om deze fout te vermijden:

imaplib.error: commando SEARCH illegaal in status AUTH, alleen toegestaan ​​in
geeft aan GESELECTEERD


Antwoord 2, autoriteit 6%

Ik ben geen expert op het gebied van Perl, maar wat ik wel weet is dat GMail IMAP en POP3 ondersteunt, 2 protocollen die volledig standaard zijn en waarmee je precies dat kunt doen.

Misschien helpt dat je om aan de slag te gaan.


Antwoord 3, autoriteit 5%

#!/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)

niet getest

  1. Zorg ervoor dat TOS dergelijke scripts toestaat, anders wordt je account opgeschort
  2. Misschien zijn er betere opties: GMail offline-modus, Thunderbird + ExtractExtensions, GmailFS, Gmail Drive, enz.

Antwoord 4, autoriteit 5%

Bekijk Mail::Webmail::Gmail:

BIJLAGEN KRIJGEN

Er zijn twee manieren om een ​​bijlage te krijgen:

1 -> Door een verwijzing naar een specifieke bijlage te sturen die is geretourneerd door 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 -> Of door de bijlage-ID en bericht-ID te verzenden

#retrieve specific attachment
my $msgid = 'F000000000';
my $attachid = '0.1';
my $attach_ref = $gmail->get_attachment( attid => $attachid, msgid => $msgid );

( Geeft een verwijzing terug naar een scalaire waarde die de gegevens van de bijlage bevat. )


Antwoord 5, autoriteit 3%

Binnen Gmail kun je filteren op “has:attachment”, gebruik het om de berichten te identificeren die je zou moeten krijgen tijdens het testen. Merk op dat dit zowel berichten met bijgevoegde bestanden lijkt te geven (paperclippictogram weergegeven), als inline bijgevoegde afbeeldingen (geen paperclip weergegeven).

Er is geen Gmail API, dus IMAP of POP zijn uw enige echte opties. De JavaMail APIkan U kunt hierbij helpen, evenals dit zeer beknopte artikel over bijlagen downloaden van IMAP met Perl. Sommige eerdere vragenhier op SO kunnen ook helpen.

Dit PHP-voorbeeldkan helpen te. Helaas is er voor zover ik kan zien geen bijlage-informatie in de imap_header, dus het downloaden van de body is vereist om het veld X-Attachment-Id te kunnen zien. (iemand bewijst dat ik ongelijk heb).


Antwoord 6, autoriteit 3%

De vraag is vrij oud en op dat moment was de Gmail API niet beschikbaar. Maar nu biedt Google Gmail API om toegang te krijgen tot IMAP. Bekijk hierde Gmail-API van Google. Zie ook google-api-python-clientop pypi.


Antwoord 7, autoriteit 2%

Als iemand van jullie heeft geüpdatet naar python 3.3, heb ik het 2.7-script van HIERgenomen en bijgewerkt het naar 3.3. Ook enkele problemen opgelost met de manier waarop Gmail de informatie terugstuurde.

# 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)

8

U moet zich bewust zijn van het feit dat u SSL nodig hebt om verbinding te maken met Gmail (zowel voor POP3 als IMAP – dit is natuurlijk ook waar voor hun SMTP-servers afgezien van haven 25, maar dat is een ander verhaal).


Antwoord 9

Heb je de GMail 3rd party add-onsbekeken op wikipedia?

In het bijzonder, phpgmaildrive is een open source-add-on dat u mogelijk in staat bent gebruik as-is, of misschien studeren voor inspiratie?


10

Voor Java vindt u G4J van gebruik. Het is een reeks API’s om te communiceren met Google Mail via Java (de screenshot op de startpagina is een demonstratie-e-mailclient die hierom is gebouwd)

Other episodes