Envoyer un email automatique de reporting en bash

Article mise à jour le: 26 septembre 2013

Lorsque vous êtes amené à faire du reporting, vous devez régulièrement envoyer les mêmes rapports aux mêmes destinataires, selon une fréquence définie par les destinataires eux-même le plus souvent. Cela implique donc de passer par de l’informatique pour gagner du temps et automatiser ces envois de rapport. Voici comment en quelques lignes linux vous pourrez vous envoyer une extraction tous les jours….

La manipulation pour automatiser un envoi de pièce jointe simple est une chose relativement aisée. Pour cela, il vous suffit de posséder une base de données, de pouvoir vous y connecter et de quelques lignes de code. Il faut être feignant dans la vie pour toutes les tâches repetitives et franchement, je ne vois pas l’intérêt de faire un tableau excel plus d’une fois quand l’informatique a été inventé pour faciliter tout ce qui est répetitif…

Attention, cet article est destiné à tous les geeks débutants et tous les analystes ayant quelques notions de code. On peut complexifier la tâche en mettant en place de jolis rapports codés par exemple en php (ce que j’ai développé pour ma compagnie) mais là il s’agit de l’envoi de simples pièces jointes par mail tous les jours.

La première étape consistera à vous connecter à votre base de données une fois que vous vous êtes connecté à votre terminal linux.

mysql -h host -u nomUtilisateur -pvotreMotDePasse nomDeLaBaseDeDonnees;

Jusque là rien de très sorcier. Vous êtes maintenant sur votre base de données SQL, mySql. La prochaine étape va d’écrire votre requête SQL, celle qui va vous servir à extraire les informations que vous voulez recevoir par email tous les jours. Par exemple, une requête comme celle ci dessous qui permettra d’extraire depuis la table NOUVEAUX_INSCRITS la liste de toutes les nouvelles inscriptions pour la journée d’hier. Une requête ultra basique (il m’est arrivé d’en écrire une dépassant les 500 lignes…)

select * from NOUVEAUX_INSCRITS where DATE=CURRENT_DATE()-INTERVAL 1 DAY;

Une fois que vous avez cela, vous vous déconnectez de votre serveur SQL avec un ctrl + d pour revenir sous linux en ligne de commande dans le terminal.

Une fois que cela est fait, la ligne à rentrer en adaptant quelques paramètres est maintenant celle-ci:

echo "select * from NOUVEAUX_INSCRITS where DATE=CURRENT_DATE()-INTERVAL 1 DAY;" | mysql -h host -u nomUtilisateur -pvotreMotDePasse nomDeLaBaseDeDonnees>output.csv; mutt -s "mettreLeSujetDeVotreEmail" email@domain.extension -a $HOME/output.csv

Ces quelques lignes, décomposées, ordonnent au bash les étapes suivantes:

  • afficher la requête SQL
  • puis la passer à mysql en input en se connectant via un « pipe »(je me dis en écrivant que l’on aurait pu écrire cela différemment mais bon..)
  • on redirige le résultat dans la base de la requête dans un fichier de sortie en .csv qu’on appelle « ouput.csv »
  • avec la commande linux mutt, on envoie un email automatique.
  • le

le fichier doit arriver de cette façon dans la boite mail sans problème! Il ne reste plus qu’à automatiser cette dernière ligne de commande à l’aide d’un crontab et vous recevrez le rapport dans votre boite mail tous les jours avec exactement le set de données que vous aurez demandé!

Le coin des achats professionnels