Pour diverses raisons on peut avoir besoin de récupérer tous les mails et leurs nombreuses pièces jointes qu’au fil du temps on a accumulé sur un serveur de messagerie distant.Les photos de vacances ,les devis, les factures etc…
Le script que je vous propose va vous permettre de réaliser une sauvegarde de votre compte email GMAIL ou YaHOO ou je ne sais encore quel autre provider de mails respectueux de votre vie privée. Donc voici un petit programme perl nettement perfectible mais qui a le mérite d’être fonctionnel et qui ouvre de nombreuses perspectives. Dans ce tuto , il effectuera simplement les actions suivantes :
- Afficher le nombre de messages stockés sur votre serveur de messagerie
- Télécharger tous les mails et leurs pièces jointes et les stocker dans un dossier au nom de l’expéditeur
Si vous n’avez jamais pratiqué le langage perl, ne fuyez pas il suffit juste de suivre les étapes de ce billet :
Les prérequis :
- perl doit être installé sur votre système mais si vous êtes sous linux ça devrait le faire. Sinon je vous laisse chercher comment faire pour votre OS dans ce très bon tuto.
- Le script fait appel à un module perl Net::IMAP::Simple::SSL. En effet , par défaut les fournisseurs de mails tels que Yahoo ou Gmail utilisent SSL comme méthode de chiffrement des communications.
- le serveur de messagerie distant doit utiliser le protocole IMAP
Pour ce faire rien de plus facile:
sudo cpan
cpan> install Net::IMAP::Simple::SSL
cpan> install MIME::Parser
Si vous voulez en savoir plus sur l’installation des modules , voici un lien très complet.
Le script:
Vous pouvez le télécharger à l’adresse de mon repo Gitlab ou sinon dans un terminal tapez:
git clone https://gitlab.com/benzoga33/MonBackupMail.git
1/ On se place dans le répertoire:
cd MonBackupMail
2/ On ajoute les droits d’exécutions sur le fichier par :
chmod u+x MonBackupMail.pl
3/ Pour exécuter le script:
./MonBackupMail
Les seules lignes à modifier sont les suivantes:
my $server = « imap.gmail.com »;
Renseigner l’adresse de votre serveur imap.Ici j’ai mis celle de Gmail mais elle sera différente si vous dépendez d’un autre provider.
Pour vous aider, voici un lien qui liste les adresses des principaux fournisseurs d’email.
Modifier et mettre votre nom d’utilisateur et votre mot de passe.
my $user=« user\@gmail.com »;
my $pass=« password »;
Attention mettre un mot de passe en clair dans un script , c’est pas bien! Il existe différentes méthodes pour palier à ce problème de sécurité.En attendant blindez les droits sur le fichier. Mais ici je vous le répète l’objectif est de faire très simple.
Résultat final
Vous obtenez un dossier du style « mailsPJ_20180518 » qui centralise sur votre pc tous vos mails et pièces jointes.
On peut imaginer par la suite continuer l’automatisation du traitement de ces fichiers à coup de commandes bash comme:
find . -type f \( -iname \*.jpg -o -iname \*.pdf) -exec cp -t ../$DOSSIER_DEST/$DATEduJour '{}' +
Là on copie tous les fichiers pdf ou jpg dans un dossier spécifique avec la date du jour. Ca n’est qu’un exemple parmi tant d’autres.
Conclusion
A titre perso, j’utilise ce script comme tâche planifiée pour une sauvegarde externe de mes mails et extirper mes factures de cantine par exemple, ça évite qu’elles trainent sur des serveurs dont j’ai très peu confiance.
A ce propos, « shame on me », j’ai pris gmail comme exemple dans le tuto mais c’est parce qu’il est utilisé par un très grand nombre. Je ne conseille pas son utilisation si vous avez des données sensibles. Si vous avez testé pour d’autres fournisseurs , n’hésitez pas à partager.
à priori on peut changer le nom du dossier dans lequel récupérer les pièces jointes aussi. Ce serait utile de l’indiquer, voire de le mettre en variable 🙂
Je pense que je vais le tester juste pour voir.
Oui je l’avais précisé dans les commentaires du script ligne 53
« # par défaut, un dossier est créé avec un nom peu explicite pour un humain (timestamp current time + processID + number sequence)
#$parser->output_under($dossier_output);
Pour modifier le nom des dossiers de stockage des mails :
$parser->output_under($dossier_output, DirName=> »$exp »)
$exp étant la variable dans laquelle est récupérer le nom de l’expediteur
Mais j’avoue que ce n’était pas très clair !
Ah, je parlais du dossier IMAP (ici, forcé à « INBOX ») ou alors je n’ai pas compris le script.
Pour le moment, j’utilise Piwigo pour récupérer les photos envoyées par la famille placée dans un dossier judicieusement nommé « Photos ». Mais le script de Piwigo doit être lancé à la main et il n’a pas l’air très fiable.
Pardon j’avais mal compris 🙂 et surtout je voyais pas trop la difficulté pour changer le INBOX et remplacer par le nom du dossier créé sur le serveur IMAP. Mais t’as raison je vais le préciser dans la source. Du coup tas pu tester sur ton dossier photos?
Peut on préciser à partir de quel date on récupère les message et les pièces jointes?