Confronté à un certain nombre de réservations non retirées par les usagers, malgré le mail envoyé au moment de la mise de côté, j’ai écrit un script qui envoie automatiquement un mail de rappel X jours avant la fin de la mise de côté.

#!/bin/bash 
# Script écrit par Stanislas JUN pour la bibliothèque municipale de Lille
# Licence GPL : https://www.gnu.org/licenses/gpl.txt
########
# aide #
########
if [ "$1" == "-h" ]|| [ "$1" == "--help" ] ; then
    echo "Cherche les mises de côté qui expirent dans X jours"
    echo "Usage: $0 [option...] X"
    echo "   -h, --help		Affiche l'aide"
    exit 0
fi
#############
# fonctions #
#############
function remplaceDiacritiques {
	titre=${titre//â/â}
	titre=${titre//á/á}
	titre=${titre//ä/ä}
	titre=${titre//à/à}
	titre=${titre//À/À}
	titre=${titre//é/é}
	titre=${titre//è/è}
	titre=${titre//ê/ê}
	titre=${titre//ë/ë}
	titre=${titre//É/É}
	titre=${titre//È/È}
	titre=${titre//î/î}
	titre=${titre//ï/ï}
	titre=${titre//í/í}
	titre=${titre//ô/ô}
	titre=${titre//ö/ö}
	titre=${titre//û/û}
	titre=${titre//ù/ù}
	titre=${titre//ú/ú}
	titre=${titre//ü/ü}
	titre=${titre//ç/ç}
	titre=${titre//Ç/Ç}
	titre=${titre//Å?/Œ}
}
##########
# script #
##########
if [ "$#" -ne 1 ]; then
	echo "Le script n'accepte qu'un paramètre en entrée : le nombre de jours"
	exit 1
fi
if [[ $1 != [0-9]* ]]; then
	echo "Le paramètre en entrée n'est pas un nombre"
	exit 1
fi
nbJours=$1
dateDemain=$( date --date="+${nbJours} day" +"%A %e %B")
echo "Envoi de mail pour rappeler les mises de côté expirant dans ${nbJours} jours"
declare -A expediteur
expediteur[BB]=xxx@mairie-lille.fr
expediteur[BO]=xxx@mairie-lille.fr
expediteur[FB]=xxx@mairie-lille.fr
expediteur[FI]=xxx@mairie-lille.fr
expediteur[JL]=xxx@mairie-lille.fr
expediteur[LS]=xxx@mairie-lille.fr
expediteur[MO]=xxx@mairie-lille.fr
expediteur[SM]=xxx@mairie-lille.fr
expediteur[VL]=xxx@mairie-lille.fr
expediteur[WA]=xxx@mairie-lille.fr
expediteur[ODY]=xxx@mediathequedelomme.com
runsql="psql -A -q -t --host=X.X.X.X --port=XXXX --username=XXXXX --no-password --dbname=portfolio --command="
array=$(${runsql}"select subscriber_no, array_agg(omnidex_id) from ci_dt_resv_copies where expiry_date = current_date +${nbJours} group by subscriber_no, branch_code order by 1")
c=0
dateJour=$( date +"%A %e %B")
log="Mails envoyés le $dateJour :\n"
for idResa in ${array[@]}; do
	tmp=${idResa//\{/}
	tmp=${tmp//\}/}
	arrtmp=(${tmp//|/ })
	idUsager=${arrtmp[0]}   
	liste_omnidexid=${arrtmp[1]}   
	array_omnidexid=(${liste_omnidexid//,/ })
	titres=""
	d=1
	for omnidexid in ${array_omnidexid[@]}; do
		titres="${titres}\n$d) $(${runsql}"select br0245 from ci_dt_resv_copies as t1 inner join ca_title_info as t2 on substring(t1.seq_vol, 1, 10)::integer = t2.seq_no where t1.omnidex_id = '$omnidexid' ")"
		((d++))
	done
	titre=$titres
	nom=$(${runsql}"select subscriber_name from ci_dt_subscriber where subscriber_no = '${idUsager}'")
        email=$(${runsql}"select address_email from ci_dt_subscriber where subscriber_no = '${idUsager}'")
        if [ -z $email ]
	then
		log="${log}${idUsager} : pas d'email\n"		
		continue
	fi
	remplaceDiacritiques
	locaCode=$(${runsql}"select branch_code from ci_dt_resv_copies where omnidex_id in (${liste_omnidexid}) limit 1 ")
	locaIntitule=$(${runsql}"select description from ca_dt_branch as t1 inner join sy_dt_description as t2 on t1.desc_id = t2.desc_id where branch_code = '${locaCode}' and lang = 'FR'")
        corps_mail="Bonjour ${nom}\n\nNous vous rappelons que les documents suivants vous sont réservés jusqu'au ${dateDemain} :\n${titre}\n\nAu-delà de cette date, ces document seront remis à disposition des autres usagers.\n\nEn cas d'impossibilité de venir les retirer, merci de nous prévenir par retour de mail..\n\nCordialement,\nBibliothèque de Lille/Lomme/Hellemmes (${locaIntitule})"
	echo -e "$corps_mail" | mail -s "Rappel : réservation disponible jusqu'au ${dateDemain} seulement"  -r "${expediteur[${locaCode}]}" ${email}
	if [ $? -eq 0 ]
	then
		log="${log}${idUsager} : ${email} : success\n"
	else
		log="${log}${idUsager} : ${email} : error\n"
	fi
         ((c++))
done
log="${log}\nTotal : ${c} mails envoyés"
echo -e "$log" | mail -s "Log des rappels des mises de côté disponibles jusqu'au ${dateDemain}" xxx@mairie-lille.fr
# FIN

Ce script est programmé via cron :

 20 06 * * * ~/script_rappel_mises_de_cote.sh 1 

On voit que le script est lancé tous les jours à 6h20, avec en paramètre le nombre de jours avant la fin de la mise de côté.
Il est donc facile de lancer le script plusieurs fois en faisant varier ce paramètre.

L’usager reçoit un mail de cette forme :

L’expéditeur de l’email est la bibliothèque où la réservation doit être retirée.

Si l’usager a plusieurs réservations avec la même date de fin de mise de côté, il ne reçoit qu’un seul mail. Mais si jamais il a fait des réservations dans plusieurs bibliothèques, il recevra un mail par bibliothèque de retrait.


Ce script est facilement adaptable à une autre bibliothèque. Il suffit de modifier :

  • l’array « expediteur » qui contient les adresses mails associées aux différentes localisations (lignes 56-66) (pour faire bien, j’aurais pu les récupérer par une requête SQL, mais bon…)
  • la variable « runsql » qui contient les paramètres d’accès à la BDD PostgreSQL (ligne 67)
  • le destinataire du log (ligne 107)

Le code n’est peut-être (sûrement, même) pas parfait, mais il fait le job.

Il est sous licence GPL, donc vous pouvez l’utiliser/modifier/diffuser librement.

Publicités