Sauvegarder les attachements d'un fichier mbox.

Il est possible qu’il y ait d’autres manières de faire, ou que votre client mail vous permet de sauver tous les attachements d’un répertoire mail…

Toujours est-il que je n’ai pas trouvé mon bonheur, j’ai donc écrit un petit script qui permet d’enregistrer dans le répertoire en cours un ensemble de fichiers attachés se trouvant dans un fichier mbox (les répertoires mail de Gnome Evolution ou Thunderbird par exemple):

#! /usr/bin/perl
use Mail::Box::Manager;

sub help_msg
{
  print "Usage: sauve_attachement.pl nom_fichier [numero sujet]\n";
  exit (0);
}

if ($#ARGV == -1)
{
  help_msg;
}
my $att_nb = 1;
my $sujet_verif = "";
my $fichier = shift;
$#ARGV < 0 or $att_nb = shift;
$#ARGV < 0 or $sujet_verif = shift;

print "Traitement du fichier $fichier\n";
print "Sauvegarde de l'attachment $att_nb\n";
print "Motif du sujet: '$sujet_verif'\n";

my $mgr = Mail::Box::Manager->new;
my $rep = $mgr->open($fichier);
foreach my $msg ($rep->messages) {
  my $sujet = $msg->get('Subject');
  if ($sujet =~ m/$sujet_verif/)
  {
    print "+ Détection du mail: $sujet \n";
    my $body  = $msg->body;
    if($body->isMultipart)
    {
      my $part = $body->part($att_nb);
      if (!defined ($part))
      {
        print "-- Pas d'attachements\n";
        next;
      }
      my $fichier_s = $part->head->get('Content-Type');
      $fichier_s =~ s/.*name="(.*)"/\1/;
      print "++ Détection du fichier $fichier_s \n";
      open (OUT, ">$fichier_s") or die "Impossible de créer le fichier $fichier_s";
      print OUT $part->decoded;
      close (OUT);
      print "++ Sauvegarde du fichier $fichier_s \n";
    }
  }
}
$rep->close;

L’utilisation est très simple, on l’appelle en lui indiquant le fichier mbox, le numéro du fichier attaché (le premier par défaut) et le motif du sujet des messages à sélectionner (vide par défaut).

Un exemple concret serait par exemple de récupérer un fichier pdf qui est envoyé à intervalle régulier comme premier attachement d’un message qui a pour début de sujet « Etat du stock« .
Bien sur, ce message doit toujours avoir le même schéma, tout du moins, le même nombre de fichiers attachés et dans le même ordre.

Supposons que le script s’appelle sauve_attachement.pl et que le fichier mbox se trouve dans le répertoire courant.

./sauve_attachement.pl fichier_mbox 1 "Etat du stock"