IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

notification de mail entrant - postfix/linux


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut notification de mail entrant - postfix/linux
    Bonjour,

    je cherche un petit script permettant d'analyser le fichier /var/log/mail.log puis extraire les infos comme :
    Date
    mail_from
    mail_to
    enfin les envoyer à user@domain.local. Dans un premier temps je les affiche pour voir déjà si ça marche.

    Je ne maîtrise pas Perl et encore moins les expressions régulières. Est ce que quelqu'un peut me donner un coup de main, pour faire ce script ?

    J'imagine un début de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl -w
    use strict;
     
    my $mail_from;
    my $mail_to;
    my $date;
     
    open(FILE, "/var/log/mail.log") or die "je n'ai pas pu ouvrir le fichier mail.log: $!; aborting";
    while (<FILE>) {
    if ($_ =~ belle expression régulière) {
    $date = $1;
    $mail_from = $2;
    $mail_to = $3;
     
    print "date: \t", $date,"\n";
    print "mail_from: \t", $mail_from,"\n";
    print "mail_to: \t", $mail_to,"\n\n";
    }
    }
    close(FILE)
    ;

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    c'est un bon début mais le problème c'est qu'une expression régulière est étroitement lié au format des données alors à moins d'être magicien....

    mets nous un exemple du format de tes données et on t'aidera

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    En effet, sans voir les données en entrée, on ne pourra pas trop t'aider à construire ton expression régulière.

    Un ou deux conseils cependant.

    Utilise plutôt "use warnings;" que la syntaxe "-w" plus ancienne et bien moins pratique.

    Ne déclare pas tes variables en début de programme mais dans le scope où tu en as besoin.

    Surtout, prends l'habitude de bien indenter ton code, c'est bien plus lisible et t'évitera de nombreux bugs. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    open my $FILE, "<", "/var/log/mail.log" or die "je n'ai pas pu ouvrir le fichier mail.log: $!; aborting";
    while (<$FILE>) {
         if ($_ =~ belle expression régulière) {
              my $date = $1;
              my $mail_from = $2;
              my $mail_to = $3;
     
              print "date: \t", $date,"\n";
              print "mail_from: \t", $mail_from,"\n";
              print "mail_to: \t", $mail_to,"\n\n";
         }
    }
    close($FILE);
    Regarde aussi la syntaxe que j'ai employée pour l'ouverture du fichier.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut
    Avec toutes mes excuses.

    J'utilise postfix sous linux. Je n'ai pas trouvé une documentation sur le format des données.
    Le lien suivant donne quelques exemples d'expressions régulières pour extraire certaines informations :http://activedeveloper.info/a-thing-...-analysis.html

    A priori, on peut extraire l'adresse mail_from (sender) et la date dans l'entrée "postfix/qmgr".
    mail_to ( destination) dans "postfix/smtp"
    l'IP du client (sender) qui se connecte au serveur SMTP, dans "postfix/smtpd".

    Lolo78, j'ai intégré l'ensemble de tes préconisations. Merci

    Merci

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Pas de raison de d'excuser, il n'y a eu aucun mal.

    Pour commencer, donne juste un extrait du fichier que tu veux étudier. Quelques dizaines de lignes suffiront, au moins pour commencer. On verra plus tard si on a besoin de plus d'exemples.

    Nous n'avons sans doute pas besoin d'aide pour trouver les bonnes expressions régulières, qui ne sont sans doute pas très complexes, mais il est impossible d'écrire une expression régulière sans voir les données qu'elle cherche à reconnaître (ou avoir une spécification très précise de leur format, mais là, il est presque certain que je rêve). Donc, un échantillon du fichier, et une explication de ce que tu veux extraire si ça n'est pas clair.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 71
    Par défaut
    salut,

    attention, si tu es sur un serveur distant ( même en local je dirai ), le fait d'afficher sur 3 lignes les mails risquent à long terme d'être illisible ( en fonction de la quantité de mails gérés journalièrement par le serveur ).

    il faudrait par exemple, à la fin de l’exécution de ton script soit faire une copie de /var/log/mail.log de manière a ensuite pouvoir créer un nouveau fichier ( /var/log/mail.log ) et ainsi, tu n'afficheras que les mails que tu n'as pas vérifié.

    ou alors de t'envoyer par mail le résultat si tu es sur un serveur distant ou de l'enregistrer dans un fichier si tu es en local. l'avantage, c'est que tu pourrais faire un crontab et te permettrait d'avoir un log pas trop lourd et assez bien classé ( 1 fois par semaine/mois par exemple ).

    pense à vérifier aussi le fichier de conf de syslog ( de mémoire /etc/syslog.conf ) de manière a ce que ne soit stocké dans /var/log/mail.log que les mails entrants et sortants ( postfix utilise le daemon de syslog ).

    quelques infos interessantes : sur le send/recp et delivery attempt et un exemple ici ou tu pourras voir que la, tu as des erreurs, et pas que le send/recep regarde aussi ici : rotatelog devrait t interesser .

    cordialement

    ours

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour les liens/ la doc. Je ne cherche pas afficher les mails sur 3 lignes. Je veux juste extraire 3 infos dans le fichier mail.log, pour chaque email reçu. Enfin, envoyer ces 3 infos par mail comme notification de réception de message par le serveur mail.

    L'un des liens que tu as rapporté (http://www.developpez.net/forums/red...2Ft-15795.html) donne un exemple du contenu de mail.log avec certaines logs postfix.

    Par exemple, quelle est l'expression qui permet d'extraire la date et le champ "to" dans la ligne suivante ? :
    Mar 31 14:44:44 ns39531 postfix/smtp[3677]: 9F7639AED8: to=<klmn@yahoo.com.tw>, relay=mx2.mail.tw.yahoo.com[203.188.197.10]:25, delay=64574, delays=63690/880/3.5/0, dsn=4.0.0, status=deferred (host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 453 Mail from 91.121.23.77 not allowed - [90])comment

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/05/2008, 08h23
  2. [Continuum] [1.1-alpha-2] notification par mail
    Par marcxa44 dans le forum Intégration Continue
    Réponses: 12
    Dernier message: 30/04/2008, 12h52
  3. [Continuum] Notification par mail
    Par marcxa44 dans le forum Intégration Continue
    Réponses: 24
    Dernier message: 11/06/2007, 11h15
  4. Réponses: 3
    Dernier message: 25/01/2007, 11h10
  5. Réponses: 2
    Dernier message: 09/05/2006, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo