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:
[pastacode lang=”python” manual=”import%20imaplib%2C%20email%2C%20os%0A%0Adetach_dir%20%3D%20′.%2F’%0A%0Am%20%3D%20imaplib.IMAP4_SSL(%22imap.my-server.it%22)%0Am.login(‘mymail%40my-server.it’%2C%20’MyPassword’)%0A%0Am.select(%22inbox%22)%0A%0Aresp%2C%20items%20%3D%20m.search(None%2C%20%22(UNSEEN)%22)%0Aitems%20%3D%20items%5B0%5D.split()%0A%0Afor%20emailid%20in%20items%3A%0A%20%20%20%20resp%2C%20data%20%3D%20m.fetch(emailid%2C%20%22(RFC822)%22)%0A%20%20%20%20email_body%20%3D%20data%5B0%5D%5B1%5D%0A%20%20%20%20mail%20%3D%20email.message_from_string(email_body)%0A%20%20%20%20temp%20%3D%20m.store(emailid%2C%20’%2BFLAGS’%2C%20’%5C%5CSeen’)%0A%20%20%20%20m.expunge()%0A%0A%20%20%20%20if%20mail.get_content_maintype()%20!%3D%20’multipart’%3A%0A%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%23print%20%22%5B%22%2Bmail%5B%22From%22%5D%2B%22%5D%20%3A%22%20%2B%20mail%5B%22Subject%22%5D%0A%0A%20%20%20%20if%20mail%5B%22From%22%5D%20%3D%3D%20’%22someone%40someserver.com%22%20%3Csomeone%40someserver.com%3E’%3A%0A%20%20%20%20%20%20%20%20for%20part%20in%20mail.walk()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20part.get_content_maintype()%20%3D%3D%20’multipart’%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20part.get(‘Content-Disposition’)%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20filename%20%3D%20part.get_filename()%0A%20%20%20%20%20%20%20%20%20%20%20%20att_path%20%3D%20detach_dir%20%2B%20str(filename)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20os.path.isfile(att_path)%20%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fp%20%3D%20open(att_path%2C%20’wb’)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fp.write(part.get_payload(decode%3DTrue))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fp.close()” message=”Il Codice:” highlight=”” provider=”manual”/]
Per poter funzionare questo script ha bisogno di tre librerie presenti in python e sono:
- imaplib
- 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:
[pastacode lang=”python” manual=”%23print%20%22%5B%22%2Bmail%5B%22From%22%5D%2B%22%5D%20%3A%22%20%2B%20mail%5B%22Subject%22%5D%0A%0A%20%20%20%20if%20mail%5B%22From%22%5D%20%3D%3D%20’%22someone%40someserver.com%22%20%3Csomeone%40someserver.com%3E’%3A” message=”Filtriamo il mittente” highlight=”” provider=”manual”/]
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:
[pastacode lang=”python” manual=”detach_dir%20%3D%20′.%2F'” message=”Path della directory corrente” highlight=”” provider=”manual”/]
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.