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 :

L'envoi de courrier avec perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut L'envoi de courrier avec perl
    Bonjour

    J'ai développé un script perl qui permet de garder les sources de son système FreeBSD à jour en informant par courrier électronique son état d'avancement.

    Il fonctionnait, il y a deux semaines et hier, j'ai réinstallé mon portable sous FreeBSD et cela ne passe plus. J'ai installé les paquetages Perl, p5-MIME-Type et nbsmtp.

    Voici le script en question :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #!/usr/bin/perl -w
     
    ## DEBUT
     
    # Clin d'oeil : 
     
    # Prérequis : FreeBSD 6.2, perl-5.8.8, p5-MIME-Lite-3.01 et fastest_cvsup-0.2.9_5
     
    # Fonction : Ce script permet de garder les sources de votre système FreeBSD à jour 
    # en vous informant par courrier électronique de son état d'avancement. 
     
    # Complément : Il vous faut installer un MTA pour envoyer les rapports par courrier
    # électronique. Vous pouvez bien entendu utiliser Sendmail ou Postfix. Afin d'éviter
    # d'installer ces deux poids lourds, utilisez plutôt ssmtp ou bien nbsmtp. Ce sont 
    # de petits utilitaires supportant tous les deux SSL et permettent l'envoi du courrier. 
    # Ils sont disponibles dans le catalogue de logiciels portés de FreeBSD. 
    #
    # Voici la procédure d'installation via les ports :
    #
    # ssmtp :
    # prompt# make -C /usr/ports/mail/ssmtp/ install clean
    #
    # nbsmtp :
    # prompt# make -C /usr/ports/mail/nbsmtp/ install clean
    #
     
    # Variables à modifier :
    #
    # $email="vous\@domaine\.tld";
    # $top="Bonjour votre prénom";
    #
     
    use strict;
    use warnings;
    use MIME::Lite; 
    use POSIX qw(strftime);
     
    # Variables
     
    # Générale
    my $datetime=strftime "(%d/%m/%y-%H:%M:%S)", localtime;
     
    # Fichiers de configuration
    my $standard_supfile="/etc/standard-supfile";
    my $standard_supfile_example="/usr/share/examples/cvsup/standard-supfile";
     
    # Programme fastest_cvsup
    my $fastest_cvsup_exec="/usr/local/bin/fastest_cvsup";
    my $countrie="us";
    my $server="";
     
    # Rapport
    my $email="mon adresse";
    my $top="Bonjour Olivier,\n\n";
    my $subject="";
    my $data="";
    my $foot="\n\nMerci.";
     
    # Fonctions
    sub send_report
    {
    	# Vérifie le sujet du message avant l'envoi
    	unless ($_[0])
    	{
    		$subject="[FreeBSD][Source]-ErrorUpdate-$datetime";
    	} else {
    		$subject="[FreeBSD][Source]-SuccessUpdate-$datetime";
    	}
    	# Envoi du rapport par email
    	print "===> Sending report by email\n";
    	my $report = new MIME::Lite
    	From       =>"$email",
    	To         =>"$email",
            Subject    =>"$subject",
    	Type       =>"TEXT",
    	Data       =>"$top$data$foot";
    	$report -> send;
    }
     
    sub select_new_server
    {
    	# Remplace le serveur par défaut par le nouveau
    	system('/usr/bin/sed \'s/*default host=.*/*default host='.$server.'/\' '.$standard_supfile.' > '.$standard_supfile.'.copy');
    	system("mv $standard_supfile.copy $standard_supfile");
    }
     
    sub test_fast_server
    {
    	# Teste les serveurs les plus rapides
    	print "===> Teste tous les serveurs $countrie\n";
    	$server=`$fastest_cvsup_exec -c $countrie | grep 1st | awk {'print \$3'}`;
    	if ($?)
    	{
    		$data="Les tests de performance sur les serveurs $countrie ont échoué.\nVérifier votre connection réseau ou Internet.";
    		send_report(0);
    		exit;
    	}
    	chomp $server;
     
            # Utilisation du nouveau serveur
    	print "Utilisation du serveur : $server\n";
     
    	# Remplace le serveur par défaut par le nouveau
    	select_new_server();
    }
     
    # Départ
    print "---------------------------------------\n";
    print "Mise à jour des sources de FreeBSD\n";
    print "---------------------------------------\n";
     
    # Vérifie les fichiers de configuration
    print "===> Vérifie les fichiers de configuration\n";
    unless (-e $standard_supfile)
    {
    	print "Création des fichiers de configuration\n";
    	if (system("/bin/cp $standard_supfile_example /etc/"))
    	{
    		$data="Le fichier squelette $standard_supfile_example est introuvable.";
    		send_report(0);
    		exit;
    	}
    } else {
    	print "Fichiers de configuration ...OK\n";
    }
     
    # Teste les serveurs les plus rapides
    test_fast_server();
     
    # Téléchargement des sources
    print "===> Téléchargement des sources\n";
    if (system("/usr/bin/csup $standard_supfile"))
    {
    	$data="Le téléchargement des sources a échoué.\nVérifier votre connection réseau ou Internet.";
    	send_report(0);
    	exit;
    } else {
    	# Les sources sont à jour.
    	$data="Les sources sont à jour.\nVous pouvez recompiler votre système.";
    	send_report(1);
    }
     
    ## FIN
    A l'exécution du script, du moins à l'instant ou le rapport doit être envoyé, cela affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ===> Sending report by email
    Pas de messages d'erreur, rien tout s'arrête

    Si quelqu'un a une petite idée, je suis preneur.

    Merci

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    A priori tu n'as plus sendmail. Comme indiqué dans la doc, le send() de MIME::Lite utilise par défaut sendmail pour envoyer son message. Pour lui imposer d'utiliser smtp, il faut mettre utiliser la méthode de classe send() de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MIME::Lite->send('smtp', "smtp.myisp.net", Timeout=>60);
    (évidemment tu changes le serveur)

    --
    Jedaï

  3. #3
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Merci de ta réponse.

    En fait dans mon compte utilisateur, j'ai un fichier .mailrc ayant comme contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set sendmail="/root/scripts/nbsmtp.sh"
    Le script nbsmtp.sh exécute nbsmtp le MTA pour envoyer mon courrier. Son contenu est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/local/bin/nbsmtp -f moi@domain.net -h ssl0.ovh.net -d elipse -p 465 -U postmaster@domain.net -P password -M l -s -V
    Ce script fonctionne car si j'utilise la commande mail, je reçois bien mon message. ce que je trouve génant c'est qu'au bout de deux semaines, cela ne fonctionne plus

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Olivier Regnier
    Ce script fonctionne car si j'utilise la commande mail, je reçois bien mon message. ce que je trouve génant c'est qu'au bout de deux semaines, cela ne fonctionne plus
    Oui, c'est embêtant, mais comme le script Perl n'a pas changé, ça n'est visiblement pas la cause du problème... Soit tu changes le script comme je te l'ai indiqué pour utiliser directement un serveur SMTP, soit tu trouves ce qui as changé entre les deux états. La version de MIME::Lite est-elle la même qu'avant ? Et nbsmtp ? Ton .mailrc a-t-il eu l'occasion de changer "sendmail" dans l'environnement où ton script est exécuté ? ...

    (Je suppose que tu as modifié les variables $email et $top dans le script, mais que tu as remis les défauts pour éviter de divulguer ton email ?)

    --
    Jedaï

  5. #5
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Citation Envoyé par Jedai
    Soit tu changes le script comme je te l'ai indiqué pour utiliser directement un serveur SMTP
    Je vais opter pour cette solution. Pour envoyer un message en passant par Ovh, il faut s'authentifier avec un login et un mot de passe en activant SSL. Cela complique l'exercice. Actuellement, je regarde du coté de Net::SMTP::TLS mais sans trop de succès donc je vais me diriger vers Net::SMTP:SSL

  6. #6
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Après quelques recherches, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my $sendmail='/usr/local/bin/nbsmtp -f moi@domain.tld -h ssl0.ovh.net -d elipse -p 465 -U postmaster@domain.tld -P password -M l -s -V';
    my $subject="test";
    my $destination="moi@domain.tld";
    my $sender="moi@domain.tld";
     
    open MAIL, "|$sendmail" or die "Can't open pipe to Sendmail\n";
     print MAIL <<"EOF";
     To: $destination
     From: $sender
     Subject: $subject 
     coucou, il faut beau
     EOF
     
    close MAIL or die "Can't close pipe to Sendmail\n";
    A l'exécution du script, j'obtiens le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't find string terminator "EOF" anywhere before EOF at monfichier.pl line x
    Aurai-je oublié quelque chose ?

    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JavaMail] problème d'envoi de courrier avec SMTP
    Par Raumsog dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 24/01/2008, 12h25
  2. Connexion avec Perl
    Par BARBIER dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/05/2004, 14h05
  3. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 11h22
  4. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08
  5. [reseaux] Comment creer un compte user à partir d'un formul avec perl
    Par oulai_evado dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 01/10/2002, 19h54

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