Scaricare allegato email con python e imap

Ho avuto recentemente necessità di scaricare un allegato (file .csv nel mio caso) ricevuto via mail, sfruttando Python.

Dopo aver dato un occhio alle librerie necessarie allo scopo sono arrivato al risultato richiesto, ecco un piccolo esempio del codice con una breve spiegazione.

Il codice:

import imaplib, email, os

detach_dir = './'

m = imaplib.IMAP4_SSL("imap.my-server.it")
m.login('mymail@my-server.it', 'MyPassword')

m.select("inbox")

resp, items = m.search(None, "(UNSEEN)")
items = items[0].split()

for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    temp = m.store(emailid, '+FLAGS', '\\Seen')
    m.expunge()

    if mail.get_content_maintype() != 'multipart':
        continue

    #print "["+mail["From"]+"] :" + mail["Subject"]

    if mail["From"] == '"someone@someserver.com" <someone@someserver.com>':
        for part in mail.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue

            filename = part.get_filename()
            att_path = detach_dir + str(filename)

            if not os.path.isfile(att_path) :
                fp = open(att_path, 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
Il Codice:

Per poter funzionare questo script ha bisogno di tre librerie presenti in python e sono:

  • imaplib
  • email
  • os

Il codice è abbastanza semplice e chiaro, si effettua una connessione alla casella di posta, tramite imap, e si seleziona la directory nella quale andare a ricercare la posta (“inbox” nel nostro caso).

Dopo di che lo script comincia a scorrere le mail ancora non lette, presenti in inbox, andando a verificare se contengono degli allegati.

Prima di procedere al download dell’allegato ho provveduto a verificare che il mittente della mail sia quello desiderato da me, nel mio caso particolare dovevo scaricare gli allegati delle mail provenienti da uno specifico indirizzo e questo l’ho fatto con un semplice if:

#print "["+mail["From"]+"] :" + mail["Subject"]

    if mail["From"] == '"someone@someserver.com" <someone@someserver.com>':
Filtriamo il mittente

Il print commentato mi è servito in fase di debug, per vedere come si presentava il mittente che mi interessava filtrare.

In fine lo script salva l’allegato.

Tenete conto del fatto che salverà l’allegato nella directory in cui si trova lo script in esecuzione e questo è definito ad inizio codice con questa riga:

detach_dir = './'
Path della directory corrente

Ovviamente questa è la sintassi corretta nel caso stiate lavorando in ambiente unix, indicando con ./ la directory corrente.

Questo è quanto!

Lo script è abbastanza semplice e lineare e pare funzionare egregiamente, almeno per quello che erano le mie necessità.

N.B.: Una volta scaricata la mail, la stessa verrà segnata come “Letta” nella nostra “inbox” il che evita che lo script, ad una seconda esecuzione, vada a scaricare nuovamente l’allegato che abbiamo già ottenuto in precedenza.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *