Bonsoir,
Je reviens sur ce sujet après quelques jours/semaines d’absence. Je me suis un peu aventuré avec Perl et les expressions régulières. Je me suis fait aider, bien entendu, sur ces dernières.
Pour la consultation de mes mèls à partir de l’extérieur, la solution des clients mail comme kmail ou Icedove, euh…outlook, etc… n’est pas pratique. Car, il faut qu’il y ait déjà un client mail d’installé sur le PC du quel je consulte mes mèls et même dans ce cas, je ne touche pas à sa configuration. Le webmail est plus adapté dans ce cas. Navigateur->roundcube sur apache2 en https->dovecot.
Pour rappeler le problème : J’ai plusieurs boites mèls (une dizaine, c’est en fonction de l’activité, elles doivent être distictes) et je n’ai pas envie de les ouvrir toutes pour voir s’il y a un mèl ou pas. J’ai donc fait un programme simple qui me dira si un mèl est arrivé et dans quelle boite.
Voici le programme pour info. Il n’est pas forcément optimisé. N’hésitez pas à me proposer des modifications.
!/usr/bin/perl
use strict;
use warnings;
my $date;
#my $client_ip;
my $mail_from;
my $mail_to;
open(my $FILE, “<”, “/var/log/mail.log”) or die “je n’ai pas pu ouvrir le fichier mail.log: $!; aborting”;
Lecture entière du fichier mail.log. Cela servira plus tard pour les stats par exemple.
while (<$FILE>) {
if ($_ =~ /(\S+ .* \d+:\d+:\d+) .* postfix/smtpd[.*]$/)
{
$date = $1;
print “\n”;
print “date: \t”, $date,"\n";
}
elsif ($_ =~ /.* postfix/qmgr[.*]: (\S+): from=<(\S+)>/)#(Je n’utiliserai peut être pas la première capture)
{
$mail_from = $2;
print “mail_from: \t”, $mail_from,"\n";
}
elsif ($_=~/.* postfix/smtp[.*]: (\S+): to=<(\S+)>/)
{
$mail_to = $2;
print “mail_to: \t”, $mail_to,"\n";
}
}
close(FILE);
my $to;
my $from;
my $subject;
my $message;
$to = 'newmail@autredomaine.fr’;
$from = 'root@domaine.fr’;
$subject = ‘Nouveau message’;
open(MAIL, “|/usr/sbin/sendmail -t”);
L’entête du mèl
print MAIL “To: $to\n”;
print MAIL “From: $from\n”;
print MAIL “Subject: $subject\n\n”;
#print MAIL “Content-type: text/html\n”;
Le corps du mèl. Il ne contient que le dernier mèl reçu. (dernier “tour” de la boucle while)
print MAIL “Date : “,$date,”\n”,"\n";
#print MAIL “Adresse IP : “,$client_ip,”\n”,"\n";
print MAIL “De : “,$mail_from,”\n”,"\n";
print MAIL "A : ",$mail_to;
close(MAIL);
#print “mèl envoyé\n”;
Ma question :
Comment lancer ce programme à chaque fois qu’une ou plusieurs lignes s’écrivent dans mail.log ?
(Je modifierai les expressions régulières plus haut pour rajouter un test sur autredomaine.fr, si non ma boite mèl des notifications sera polluée par n’importe par quel mail du système)