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

Langage Perl Discussion :

Envoi mail du contenu d'une log


Sujet :

Langage Perl

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut Envoi mail du contenu d'une log
    Bonjour à tous et très bonne année 2011 !

    Ma demande est la suivante.
    J'ai une log journalière à émettre par mail. l'idée est de lire le contenu du fichier (dans l'ex ci-dessous "test.txt") et envoyer son contenu dans le corps du message.

    Voici mes lignes de codes mais cela ne fonctionne pas. merci de votre aide.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/perl -w
    use strict; 
    use warnings;
    use Net::SMTP;
     
     
    my ($smtpserver, $from, $to, $subject, $message, $smtp, $replyaddr, $opt, $Resultat);
     
    # ouverture du fichier contenant la log
        open (Resultat, "<test.txt");	
     
    $smtpserver = "smtp";
    $from = "toto\@.fr";
    $to = "tata\@.fr";
    $subject = "Etat demarrage";
     
    # Envoi du message
    $smtp = Net::SMTP->new("$smtpserver", Timeout => 120);
    $smtp->mail("$from");
    $smtp->to("$to");
     
    $smtp->datasend("To: $to\n");
    $smtp->datasend("From: $from\n");
    $smtp->datasend("Reply-to: $replyaddr\n") if $replyaddr;
    $smtp->datasend("X-Mailer: Perl Sendmail \n");
    $smtp->datasend("Subject: $subject\n");
    $smtp->datasend("\n");
    $smtp->data();
    $smtp->datasend("Resultat\n");
    $smtp->dataend();
    $smtp->quit();
     
     close(Resultat);
     
    # message de confirmation
    print "Content-type: text/html\n\n";
    print "OK<BR>\n";
    exit;

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut et bonne année,

    C'est bien d'ouvrir et fermer ton fichier mais encore faut-il traiter son contenu.

    Je t'invite à consulter ce tutoriel.

    http://www.tutorials-expert.com/tuto...-Files-IO.html

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Merci

    J'ai regardé ton lien mais il ne traite pas le cas d'envoi du contenu du fichier en tant que corps de message d'un mail.

    Une idée ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    Salut,

    En perl, pour lire un fichier, on procède de la façon suivante:
    1) On ouvre le fichier
    2) On fait une boucle pour parcourir chaque ligne du fichier
    3) Ensuite on le ferme

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/usr/bin/perl
     
    open(DATA, "<file.txt");
     
    while($ligne = <DATA>)
    {
       print $ligne."\n";
    }
     
    close(DATA);

    Dans ton cas, cela pourrait se faire de la façon suivante:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #!/usr/bin/perl -w
    use strict; 
    use warnings;
    use Net::SMTP;
     
     
    my ($smtpserver, $from, $to, $subject, $message, $smtp, $replyaddr, $opt, $Resultat);
     
    # ouverture du fichier contenant la log
    my $corpmessage = "";
    open (Resultat, "<test.txt");	
    while($ligne = <DATA>)
    {
       $corpmessage = $corpmessage.$ligne."\n";
    }
    close(Resultat);
     
     
    $smtpserver = "smtp";
    $from = "toto\@.fr";
    $to = "tata\@.fr";
    $subject = "Etat demarrage";
     
    # Envoi du message
    $smtp = Net::SMTP->new("$smtpserver", Timeout => 120);
    $smtp->mail("$from");
    $smtp->to("$to");
     
    $smtp->datasend("To: $to\n");
    $smtp->datasend("From: $from\n");
    $smtp->datasend("Reply-to: $replyaddr\n") if $replyaddr;
    $smtp->datasend("X-Mailer: Perl Sendmail \n");
    $smtp->datasend("Subject: $subject\n");
    $smtp->datasend("\n");
    $smtp->data();
    $smtp->datasend($corpmessage);
    $smtp->dataend();
    $smtp->quit();
     
     
     
    # message de confirmation
    print "Content-type: text/html\n\n";
    print "OK<BR>\n";
    exit;

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Bonjour,

    Merci pour ces explications.
    En appliquant ton code j'ai ces erreurs de compil'

    Name "main:ATA" used only once: possible typo at envoimail.pl line 13.
    readline() on unopened filehandle DATA at envoimail.pl line 13.

    ligne 13 contient
    while($ligne = <DATA>)
    on doit pas définir __DATA__ qq part ?

    au final, le mail est envoyer mais vide au niveau du corps de message, destinataire et sujet vides.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Par défaut
    Faute de copier/coller....

    remplace <DATA> par <Resultat>

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Pour envoyer un email avec un fichier joint, Net::SMTP n'est pas adapté. Il convient de plutôt utiliser le module MIME::Lite.

  8. #8
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Bonjour,

    Dans le cas présent, ce n'est pas une pièce à joindre à un mail mais le contenu d'un fichier dans le corps du message.

    ça fonctionne bien pour le corps du message (sauf qu'un saut de ligne est présent entre chaque ligne)
    par contre destinataire et sujet sont toujours vides

    Merci

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Remontre nous ton code

  10. #10
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    C'est celui-ci

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    #!/usr/bin/perl -w
    use strict; 
    use warnings;
    use Net::SMTP;
     
     
    my ($smtpserver, $from, $to, $subject, $message, $smtp, $replyaddr, $opt, $Resultat);
     
    # ouverture du fichier contenant la log
    my $corpmessage = "";
    open (Resultat, "<test.txt");	
    while($ligne = <Resultat>)
    {
       $corpmessage = $corpmessage.$ligne."\n";# en retirant ce "\n", cela fait des lignes continuent
    }
    close(Resultat);
     
     
    $smtpserver = "smtp";
    $from = "toto\@.fr";
    $to = "tata\@.fr";
    $subject = "Etat demarrage";
     
    # Envoi du message
    $smtp = Net::SMTP->new("$smtpserver", Timeout => 120);
    $smtp->mail("$from");
    $smtp->to("$to");
     
    $smtp->datasend("To: $to\n");
    $smtp->datasend("From: $from\n");# info non prise en compte
    $smtp->datasend("Reply-to: $replyaddr\n") if $replyaddr;
    $smtp->datasend("X-Mailer: Perl Sendmail \n");
    $smtp->datasend("Subject: $subject\n");# info non prise en compte
    $smtp->datasend("\n");
    $smtp->data();
    $smtp->datasend($corpmessage);
    $smtp->dataend();
    $smtp->quit();
     
     
     
    # message de confirmation
    print "Content-type: text/html\n\n";
    print "OK<BR>\n";
    exit;

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Net::SMTP;
     
    my $smtpserver = 'smtp';
    my $from       = 'toto@.fr';
    my $to         = 'tata@.fr';
    my $subject    = 'Etat demarrage';
     
    my $smtp = Net::SMTP->new( $smtpserver, Timeout => 120 )
      or die "Impossible de se connecter au serveur : $smtpserver\n - $!";
    $smtp->mail($to)                       or die "souci methode mail() : $to";
    $smtp->to($to)                         or die "souci methode to() : $to";
    $smtp->data()                          or die 'souci methode data()';
    $smtp->datasend("Subject: $subject\n") or die 'souci methode datasend()';
     
    # ouverture du fichier contenant la log
    my $fichier = 'test.txt';
    open( my $fh, '<', $fichier ) or die "Impossible de lire le fichier $fichier";
    while ( my $ligne = <$fh> ) { $smtp->datasend($ligne) or die "souci méthode datasend : $ligne"; }
    close($fh) or die "Impossible de fermer le fichier $fichier";
     
    $smtp->dataend() or die 'souci méthode dataend';
    $smtp->quit()    or die 'Impossible de fermer la connexion smtp!';
     
    # message de confirmation
    print "Content-type: text/html\n\n";
    print "OK<BR>\n";

  12. #12
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Alors ce nouveau code fonctionne pour un fichier avec le nom simple "fichier.txt"
    Avec toutefois :
    - non prise compte des sauts de ligne contenu dans le fichier lu
    j'ai un corps de message de ce type [Parametre1][Parametre2][Parametre3]
    au lieu de
    [Parametre1]
    [Parametre2]
    [Parametre3]

    - Le destinataire "to" n'est pas affiché
    $smtp->to($to)
    Pour info, je souhaites lire le contenu du fichier Resultat.$date_today.txt (et non texte.txt) (en utilisant ton sub date) et là il m'indique une erreur

    Impossible de lire le fichier Resultat.$date_today.txt at Parser.pl line
    946.

    J'ai donc modifié le code de cette façon : c'est OK MAIS l'affichage du corps de message reste incorrecte (non prise compte des sauts de ligne contenu dans le fichier lu)

    open(corpsmessage, "<Resultat.$date_today.txt") or die "Impossible de lire le fichier corpsmessage";
    while ( my $ligne = <corpsmessage> ) { $smtp->datasend($ligne) or die "souci méthode datasend : $ligne"; }
    close(corpsmessage) or die "Impossible de fermer le fichier corpsmessage";

  13. #13
    Invité
    Invité(e)
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Content-type: text/html\n\n";
    Si tu utilises le content-type html, tu dois utiliser les balises html pour les sauts de ligne. à savoir la balise <br>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $smtp->datasend($ligne.'<br>')

  14. #14
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    merci pour la proposition mais cela ne fonctionne toujours pas

  15. #15
    Invité
    Invité(e)
    Par défaut
    Tes paramètres sont-ils tous sur une même ligne dans ton fichier texte?

  16. #16
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Djibril, en revenant sur ton code ci-dessus il m'indique cette erreur en fin de traitement

    => Impossible de lire le fichier Resultat.$date_today.txt at Parser.pl line
    946.

    ligne 946
    open( my $fh, '<', $corpsmessage ) or die "Impossible de lire le fichier $corpsmessage";

  17. #17
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 39
    Par défaut
    Bonjour Mygale1978

    En fait c'est une copie conforme du fichier que je souhaites dans le corps du message du mail

    Fichier texte (pas sur la même ligne)
    [Parametre1]
    aaa
    bbb
    [Parametre2]
    aaa
    [Parametre3]
    ccc

    Corps message souhaité à l'identique MAIS actuellement c'est
    [Parametre1] aaa bbb [Parametre2] aaa [Parametre3] ccc

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ok,

    Je viens de relire le code précédent

    Le content type n'est pas spécifié lors de l'envoi du mail. pour le fichier texte dans la variable tu as une virgule en trop.

    Voici le code corrigé avec les adaptations en gras

    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
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Net::SMTP;
    
    my $smtpserver = 'localhost';
    my $from       = 'xxx@xxx.xxx';
    my $to         = 'xxx.xxxx@xxx.xxx';
    my $subject    = 'Etat demarrage';
    
    my $smtp = Net::SMTP->new( $smtpserver, Timeout => 120 )
      or die "Impossible de se connecter au serveur : $smtpserver\n - $!";
    $smtp->mail($to)                       or die "souci methode mail() : $to";
    $smtp->to($to)                         or die "souci methode to() : $to";
    $smtp->data()                          or die 'souci methode data()';
    $smtp->datasend("Content-Type: text/html\n");
    $smtp->datasend("Subject: $subject\n") or die 'souci methode datasend()';
    
    # ouverture du fichier contenant la log
    my $fichier = 'test.txt';
    open( my $fh, '<'.$fichier ) or die "Impossible de lire le fichier $fichier";
    while ( my $ligne = <$fh> ) { $smtp->datasend($ligne . '<br>') or die "souci méthode datasend : $ligne"; }
    close($fh) or die "Impossible de fermer le fichier $fichier";
    
    $smtp->dataend() or die 'souci méthode dataend';
    $smtp->quit()    or die 'Impossible de fermer la connexion smtp!';

  19. #19
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Arrêtez de vous compliquer la vie. Le bonne écriture perl pour la lecture de fichier se fait en 3 arguments et s'écrit de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open( my $fh, '<', $fichier ) or die "Impossible de lire le fichier $fichier";
    Maintenant, c'est à vous d'élaborer un algorithme simple pour la variable $fichier.
    Dans mon programme d'exemple, $fichier est égale à test.txt. A vous de le spécifier.

    A quoi doit il normalement ressembler ? Il doit contenir la date du jour ? Donnez un exemple précis.

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Sinon je persite en vous suggérant d'utiliser MIME::Lite.

    Voici un code tout fait pour vous
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Carp;
     
    use MIME::Lite;
     
    my $smtpserver = 'smtp';
    my $from       = 'toto@.fr';
    my $to         = 'tata@.fr';
    my $subject    = 'Etat demarrage';
    my $message;
     
    # ouverture du fichier contenant la log
    # A vous de modifier automatiquement ou non $fichier
    my $fichier = 'test.txt';
    open( my $fh, '<', $fichier ) or die "Impossible de lire le fichier $fichier";
    while ( my $ligne = <$fh> ) { $message .= $ligne; }
    close($fh) or die "Impossible de fermer le fichier $fichier";
     
    my $mail = new MIME::Lite
      From    => $from,
      To      => $to,
      Subject => $subject,
      Type    => 'text/html',
      Data    => $message;
     
    $mail->send_by_smtp($smtpserver) or die "mail non envoye\n$!\n\n";
    print "mail envoye";

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Envoi le contenu d'une Views par mail ?
    Par Frisco dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2007, 14h20
  2. [Mail] Envoi du contenu d'une pièce jointe par mail
    Par nonhosonno dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2007, 13h42
  3. Envoi mail aux résultats d'une requête
    Par martonpylon12 dans le forum Access
    Réponses: 2
    Dernier message: 12/01/2006, 12h13
  4. Contenu du fichier log d'une BD
    Par sandanr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/10/2005, 14h50
  5. [Oracle 10g] Envoi mail avec PJ à une heure donnée
    Par djoule6 dans le forum Oracle
    Réponses: 5
    Dernier message: 25/10/2005, 11h51

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