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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
| # LIBRAIRIES
use strict;
use warnings;
use Mail::Sender;
use PmOutils;
# VARIABLES GLOBALES
my $SMTP = "mail.mon_provider.fr";
my $FROM = 'user@mon_provider.fr';
my $REPLYTO = $FROM;
my $SIGNATURE;
my $DEBUG = 0;
# VARIABLES
my $FicMailto = "mailto.txt";
my $FicMailDebug = "MailDebug.log";
my $Instance;
my %Mail;
# PROGRAMME PRINCIPAL
# Récupération du paramètre fourni au programme
if (! $ARGV[0] || $ARGV[0] !~ /^[on]$/i)
{
print "Usage : Nom_du_programme <option1>\n\n";
print "\t<option1> o = mode DEBUG actif (mode verbose)\n";
print "\t n = mode DEBUG inactif (pas de mode verbose)\n\n";
exit();
}
$DEBUG = ($ARGV[0] =~ /o/i ? 1 : 0);
open(STDERR, ">log.log") or die();
# On ouvre le fichier des mails en lecture et on crée la nouvelle instance
open(MAILTO, "$FicMailto") or PmOutils::Die("Lecture de $FicMailto impossible : $!\n");
if ($DEBUG) # si mode DEBUG actif, on garde une trace des conversations avec serveur SMTP dans un log
{
# création du log
open(DEBUG, ">>$FicMailDebug") or PmOutils::Die("Mise à jour de $FicMailDebug impossible : $!\n");
# création de l'instance avec mode verbose
$Instance = new Mail::Sender
{
smtp => $SMTP,
from => $FROM,
replyto => $REPLYTO,
debug => \*DEBUG
};
}
else
{
# création de l'instance SANS mode verbose
$Instance = new Mail::Sender
{
smtp => $SMTP,
from => $FROM,
replyto => $REPLYTO,
};
}
if (! ref $Instance) # si la connection distante a échoué
{
PmOutils::Die("La connection au serveur $SMTP a échoué : $Mail::Sender::Error\n");
}
# On compose la signature à inclure automatiquement dans les mails
$SIGNATURE = <<END_OF_SIGNATURE;
-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
E-mail : $REPLYTO
Site : mon site perso
Forum : mon forum
Merci d'indiquer votre n° de compte joueur dans toute correspondance.
-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
END_OF_SIGNATURE
# Traitement des mails à envoyer
while(<MAILTO>)
{
if (/^TO:(.+)\n$/)
{
if (%Mail)
{
if (! TraiteMail(%Mail))
{
PmOutils::Warn(1, "Le mail en cours n'a pu etre envoyé !\n");
}
%Mail = ();
}
@{$Mail{TO}} = split(/,/, $1);
PmOutils::Warn(0, "Nouveau mail destiné à : '", join("', '", @{$Mail{TO}}), "'\n");
}
elsif (/^SUJET:(.+)\n$/)
{
$Mail{SUJET} = $1;
print STDERR "\tsujet trouvé pour mail en cours ligne $.\n" if ($DEBUG);
}
elsif (/^MESSAGE:(.+)$/)
{
$Mail{MESSAGE} = $1;
print STDERR "\tdébut de message trouvé pour mail en cours ligne $.\n" if ($DEBUG);
}
elsif (/^FICHIER:(.+)\n*$/)
{
@{$Mail{FICHIER}} = split(/,/, $1);
}
else
{
# on vérifie que le mail en cours est constitué correctement avant de s'assurer que la ligne en cours
# corresponde à une ligne du message du mail
if ( ! defined(@{$Mail{TO}}) || ! $Mail{SUJET} || ! $Mail{MESSAGE} || defined(@{$Mail{FICHIER}}) )
{
PmOutils::Warn(1, "La ligne $. dans fichier $FicMailto ne semble appartenir à aucun mail !\n");
}
else # il s'agit bien de la suite du message
{
$Mail{MESSAGE} .= "$_";
print STDERR "\tsuite du message trouvé pour mail en cours ligne $.\n" if ($DEBUG);
}
}
}
close(MAILTO);
# S'il restait un mail à envoyer (le dernier)
if (%Mail) # on envoie le mail précédemment reconstitué (s'il existe)
{
if (! TraiteMail(%Mail))
{
PmOutils::Warn(1, "Le mail en cours n'a pu etre envoyé !\n");
}
}
# Fin de traitement
exit();
sub TraiteMail
{
my %NewMail = (@_); # le mail à envoyer
my $Destinataire; # destinataires du mail
my $TempsDebut = time(); # pour compter le temps de traitement d'envoi du mail
my $TempsFin;
# on vérifie que le mail soit bien complet
if ( ! defined(@{$NewMail{TO}}) || ! $NewMail{SUJET} || ! $NewMail{MESSAGE})
{
print STDERR "Pas de destinataires pour mail en cours !\n" if (! defined(@{$NewMail{TO}}));
print STDERR "Pas de sujet pour mail en cours !\n" if (! $NewMail{SUJET});
print STDERR "Pas de message pour mail en cours !\n" if (! $NewMail{MESSAGE});
return 0;
}
# composition de la liste des destinataires du mail
$Destinataire = join(",", @{$NewMail{TO}});
# ajout de la signature dans le message
$NewMail{MESSAGE} .= $SIGNATURE;
# on détermine la méthode à appliquer au mail en fonction des pièces jointes ou non
if (defined @{$NewMail{FICHIER}})
{
PmOutils::Warn(0, "\tNbre de pièces jointes : ", scalar(@{$NewMail{FICHIER}}), "\n");
# on applique la méthode MailFile ici
$Instance->MailFile(
{
to => $Destinataire,
subject => $NewMail{SUJET},
msg => $NewMail{MESSAGE},
file => \@{$NewMail{FICHIER}}
});
# on vérifie que le mail était bien ok
if (! ref $Instance) # si la connection distante a échoué
{
PmOutils::Warn(0, "L'envoi du mail via méthode MailFile a échoué : $Mail::Sender::Error\n");
return 0;
}
}
else
{
PmOutils::Warn(0, "\tNbre de pièces jointes : 0\n");
# méthode MailMsg ici (pas de pièces jointes)
$Instance->MailMsg(
{
to => $Destinataire,
subject => $NewMail{SUJET},
msg => $NewMail{MESSAGE},
});
if (! ref $Instance) # si la connection distante a échoué
{
PmOutils::Warn(0, "L'envoi du mail via méthode MailMsg a échoué : $Mail::Sender::Error\n");
return 0;
}
}
# le mail a correctement été envoyé, on calcule le temps de l'envoi
$TempsFin = time();
PmOutils::Warn(0, "Mail envoyé en ", int($TempsFin - $TempsDebut + 0.5), " seconde(s)\n");
return 1;
} |
Partager