Archives par mot-clé : qmail

Traiter / Parser un mail lors de son arrivée

Bonjour,

On est souvent confronté a un problème qui peut sembler simple sur le papier mais qui en réalité est un peu plus complexe.

Le principe est d’écouter le dossier “mailbox” et sur les évènements executer un traitement. On va pour cela utiliser la commande “inotifywait”.

Tout d’abord installer inotifywait sur le serveur avec la commande suivante :

SERVER:~$ sudo apt-get install inotify-tools
sudo: unable to resolve host mathieu-ubuntu
[sudo] password for mathieu:
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
libinotifytools0
Les NOUVEAUX paquets suivants seront installés :
inotify-tools libinotifytools0
0 mis à jour, 2 nouvellement installés, 0 à enlever et 3 non mis à jour.
Il est nécessaire de prendre 48,1 ko dans les archives.
Après cette opération, 201 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? O
Réception de : 1 http://fr.archive.ubuntu.com/ubuntu/ oneiric/universe libinotifytools0 i386 3.13-3 [21,2 kB]
Réception de : 2 http://fr.archive.ubuntu.com/ubuntu/ oneiric/universe inotify-tools i386 3.13-3 [26,9 kB]
48,1 ko réceptionnés en 0s (113 ko/s)
Sélection du paquet libinotifytools0 précédemment désélectionné.
(Lecture de la base de données... 481663 fichiers et répertoires déjà installés.)
Dépaquetage de libinotifytools0 (à partir de .../libinotifytools0_3.13-3_i386.deb) ...
Sélection du paquet inotify-tools précédemment désélectionné.
Dépaquetage de inotify-tools (à partir de .../inotify-tools_3.13-3_i386.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Paramétrage de libinotifytools0 (3.13-3) ...
Paramétrage de inotify-tools (3.13-3) ...
Traitement des actions différées (« triggers ») pour « libc-bin »...
ldconfig deferred processing now taking place
SERVER:~$

Ok “inotify-tools” est installé, on peut maintenant parcourir l’aide de ce petit outils avec la commande  “inotifywait –help” :

SERVER:~$ inotifywait --help
inotifywait 3.13
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
-h|--help Show this help text.
@<file> Exclude the specified file from being watched.
--exclude <pattern>
Exclude all events on files matching the
extended regular expression <pattern>.
--excludei <pattern>
Like --exclude but case insensitive.
-m|--monitor Keep listening for events forever. Without
this option, inotifywait will exit after one
event is received.
-r|--recursive Watch directories recursively.
--fromfile <file>
Read files to watch from <file> or `-' for stdin.
-q|--quiet Print less (only print events).
-qq Print nothing (not even events).
--format <fmt> Print using a specified printf-like format
string; read the man page for more details.
--timefmt <fmt> strftime-compatible format string for use with
%T in --format string.
-c|--csv Print events in CSV format.
-t|--timeout <seconds>
When listening for a single event, time out after
waiting for an event for <seconds> seconds.
If <seconds> is 0, inotifywait will never time out.
-e|--event <event1> [ -e|--event <event2> ... ]
Listen for specific event(s). If omitted, all events are
listened for.Exit status:
0 - An event you asked to watch for was received.
1 - An event you did not ask to watch for was received
(usually delete_self or unmount), or some error occurred.
2 - The --timeout option was given and no events occurred
in the specified interval of time.Events:
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in
writeable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
SERVER:~$

On remarque plusieurs options intéressantes notamment l’option ” -e” qui permet de spécifier des evenements d’ecoute. Une commande du type “inotifywait -e create” va écouter les evenement de type “Création de fichier”. On trouve aussi l’option “-m” qui permet a inotify de ne pas s’arreter apres le premier evenement détecté. il existe aussi l’option “-c” qui permet de recupérer l’evenement sous un format CSV.

On va donc utiliser toutes ses options pour détecter les evenements qui nous intéresseavec la commande suivante :

SERVER:~#inotifywait -cm -e create /home/vpopmail/domains/domain.com/journal/Maildir/new/ | php parseMail.php

Cette commande permet de détecter les evenements de création de fichier dans le dossier mailbox du domaine domain.com . On execute à la suite de cet évènements la commande #php parseMail.php qui va traiter le mail recu.