Attenzione: l'articolo è stato scritto da oltre 1 anno, le informazioni in esso contenute potrebbero essere datate e non più attuali.

[Perl] - Scarichiamo gli allegati della posta elettonica in automatico

Dopo lo script per scaricare file da un sito web protetto da password (avendo le password ovviamente), vediamo un altro script scritto in Perl che consente di salvare in una cartella del computer tutti gli allegati alle email che abbiamo ricevuto. Per fare ciò analizza il file mbox creato dal gestore di posta elettronica quindi funziona con Thunderbird ma non con Outlook né tantomeno direttamente dai nostri account online. E' stato testato solo con Thunderbird

Requisiti

Per funzionare è necessario che abbiate installato sul vostro computer Perl e alcuni moduli:

use Config;
use Mail::MboxParser;
use Mail::MboxParser::Mail;
use File::Path;
use Email::Valid;
use FindBin '$Bin';

Attenzione: se usate l'ultima versione di ActivePerl per installare Perl non riuscirete ad installare il modulo MboxParser e quindi non funzioneà lo script.

Uso

L'uso è seplice basta scaricare il file zip allegato e decomprimerlo.

Modificare il file che termina con Conf.pl per indicare allo script dove si trova la cartella di Thunderbird e dove volete salvare gli allegati.

A questo punto avviate  lo script e seguite le indicazioni, potete scegliere se scaricare gli allegati da un solo mittente oppure da tutti mettendo l'asterisco invece dell'indirizzo email.

Problemi

Ci sono ancora molte cose da modificare per rendere lo script più semplice, chiunque voglia farlo è benvenuto. Io lo uso per automatizzare alcuni compiti e va bene così, renderlo più semplice richiederebbe troppo tempo. Se fate modifiche siete liberi di pubblicarle come commento o farmelo sapere per modificare lo script.

Uno svantaggio per me fastidioso è che lo script processa ogni volta tutto il file e quindi può impiegarci anche un minuto buono, ogni volta che viene eseguito, se avete un file di posta particolarmente voluminoso.

Un altro poblema che finora non ho testato è quello legato al caso in cui riceviate dallo stesso mittente file con lo stesso nome, in questi casi il file più recente non viene scaricato. Questo problema verrà risolto nella prossiima versione se ci sarà ;)

Di seguito lo script se volete darci uno sguardo:

#!/usr/bin/perl
# versione 0.18 21/02/2012
# CHANGELOG
# 0.01 - Prima versione leggermente modificata di uno script trovato in rete
# 0.08 - Inserita la possibilita di controllare un singolo mittente o tutte le email
# 0.10 - Inserito un controllo sulla validità dell'email inserita
# 0.11 - Crea sottocartelle in base al mittente, se non ci sono allegati non viene creata la cartella.
# 0.15 - Inserito un controllo sull'esistenza del file, se esiste non lo riscarica. Il vantaggio
# principale è che la data di creazione del file non cambia.
# 0.18 - Inserito un controllo sulla cartella Inbox, se non esiste esco.
#
# DA FARE
# Chiedere se inserire come prefisso la data di ricevimento della mail o lasciare il nome inalterato
# Fare un'interfaccia interattiva in cui scegliere la data (ultimo 1-3-6 mese) e indirizzo di origine, * per tutti i mittenti
# Cercare automaticamente le cartelle in thunderbird e proporla all'utente
# Scegliere la cartella in cui salvare gli allegati in base al mittente o alla scelta dell'utente - Fatto +/-
# Inserire comando per aprire la cartella dei download
#
# Riferimenti web
# http://search.cpan.org/~vparseval/Mail-MboxParser-0.55/MboxParser.pm
# http://cpan.uwinnipeg.ca/htdocs/Mail-MboxParser/Mail/MboxParser/Mail.html
# https://gist.github.com/1408565
# http://cpan.uwinnipeg.ca/htdocs/Mail-MboxParser/Mail/MboxParser/Mail.htm...

#use strict;
use Config;
use Mail::MboxParser;
use Mail::MboxParser::Mail;
use File::Path;
use Email::Valid;
use FindBin '$Bin';

if ($^O =~ /MSWin32/) {
# Set up Windows variables
$screen_clear = "cls";}
else {
# Set up UNIX variables
$screen_clear = "clear";}

# Carico il file di configurazione, cercandolo a partire dalla cartella in cui si trova lo script
# ovvero $Bin
require "$Bin/ScaricaAllegatiConf.pl";
# Pulisco lo schermo del terminale
system("$screen_clear");
print "##############################################################\n";
print "# Scarica allegati da Thunderbird #\n";
print "# Questo script consente di scaricare gli allegati alle mail #\n";
print "# da un file mbox, ad esempio quello gestito da Thunderbird #\n";
print "# #\n";
print "# www.volalibero.it #\n";
print "##############################################################\n\n";

# Definisco le variabili dove salvare i file prendendole dal file di configurazione
$cartelladl=$Config::cartelladl;
### print "$cartelladl\n";

unless (-d $cartelladl) {
print "La cartella di download - $cartelladl - non esiste. La creo [s/n]?";
chomp($crearisp = lc(<STDIN>));
if ($crearisp eq "s")
{
mkpath ($cartelladl) and print "La cartella e\' stata creata\n" or die "\ERRORE: non e\' stato possibile creare la cartella\n";
} else
{
print "Senza una cartella di download non posso andare avanti";
exit;
}
}

# Routine per controllare l'esistenza di una cartella, se non esiste la crea
sub checkfolder {
my $checkfolder2= @_[0];
###print $checkfolder2;
unless (-d $checkfolder2) {
mkpath ($checkfolder2) and print "La cartella e\' stata creata\n" or die "\ERRORE: non e\' stato possibile creare la cartella\n";
} else {
#print "La cartella esiste, vado avanti.\n"
};
}

# Definisco la cartella Inbox di Thunderbird prendendola dal file di configurazione
$mymailbox=$Config::mymailbox;
### print "$mymailbox\n";
unless ( -e $mymailbox ) {
print "La cartella Inbox non esiste, modifica i dati nel file di configurazione.\nPremi Invio per uscire.\n";
$uscita = <STDIN>;
exit;
}
# Non passo opzioni al parser
my $parseropts="";
open(FD,"$mymailbox");
# Creo un nuovo oggetto messaggio
my $mb = Mail::MboxParser->new($mymailbox,decode=>'ALL',parseropts=> $parseropts);
# Inizializzo il contatore
my $contatore = 0;
print "Inserisci il mittente (* per scaricare tutti gli allegati)\n";
###print "Alcuni indirizzi importanti: gpa\@ILSOLE24ORE.COM\ncircolaresettimanafiscale\@ILSOLE24ORE.COM\n";
$check=0;
while ($check == 0)
{
# assegno alla variabile mittente il contenuto dei dati immessi e trasformati in minuscolo
chomp($mittente = lc(<STDIN>));
### print "$mittente\n";
### non capisco perché la seguente espressione regolare non funziona
### in alternativa uso il modulo Email:: Valid
### if ($mittente =~ /^(\w\-\_\.)+\@((\w\-\_)+\.)+[a-zA-Z]{2,}$/)
if (Email::Valid->address($mittente))
{
print "Indirizzo valido, vado avanti.\n";
$check=1;
}
elsif ($mittente eq "*") {
$userfolder[0]="";
print "Hai scelto di elaborare tutte le email.\n";
$check=1;
}
else
{
print "$mittente non è un indirizzo valido\n";
print "Inseriscine uno valido oppure\n";
print "l'asterisco per esaminare tutte le email.\n";
}
}

# Il prossimo ciclo analizza tutti i messaggi contenuti nella cartella Inbox
# e salva tutti gli allegati provenienti dall'indirizzo indicato
while (my $msg = $mb->next_message) {
### Stampo il mittente della mail per debugging
### print $msg->from->{email};
if ((lc($msg->from->{email}) eq "$mittente") || ($mittente eq "*") ) {
### @userfolder = split('@', $msg->from->{email});
$userfolder[0] = lc($msg->from->{email});
$userfolder[0] =~ s/@/-/g;
$userfolder[0] =~ s/\./_/g;
### print "$userfolder[0]\n";
my $mapping = $msg->get_attachments;
print "Processo il messaggio n. ".++$contatore."\n";
for my $filename (keys %$mapping) {
$filedl = $cartelladl . "\\$userfolder[0]\\" . $filename;
if (-e $filedl)
{
print "L\'allegato " . "$filename" . " e\' gia\' stato scaricato. Vado avanti.\n";
# print "$filename => $mapping->{$filename}"
} else {
print "Scarico l\'allegato:";
print "$filename => $mapping->{$filename}\n";
$cartellaallegati = $cartelladl . "\\$userfolder[0]\\";
###print "$cartellaallegati\n";
&checkfolder ($cartellaallegati);
$msg->store_all_attachments(path => "$cartellaallegati");
}
}
}
}

print "Operazioni concluse.\n";
close (FD);

Nessun voto finora
AllegatoDimensione
Script per Scaricare gli Allegati2.9 KB