Envoi de mail pour Anniversaire

Résolu/Fermé
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 - 4 févr. 2018 à 18:29
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 - 6 févr. 2018 à 09:04
Bonjour, j'ai créé un envoi de mail pour souhaiter l'anniversaire des membres. Le script fonctionne bien du moins c'est ce que j'ai pu voir après plusieurs essais. J'aurai pensé au départ que l'envoi de mail allais se multiplier par rapport à mon script mais ce n'ai pas le cas. Je voulais créé un champ avec comme valeur par default 0 avec une condition style comme ci-dessous.
Pouvez-vous me donner votre avis sur la question.
Je vous remercie.
if ($DateJour == $anniv_date) AND $anniv['mail'] == 0 {
ENVOI LE MAIL
MISE A 1 DU CHAMP MAIL
}

Voici ma page envoi_anniv.php
<?php require("init.php"); ?>
    <?php
    // Afficher les erreurs à l'écran
    ini_set('display_errors', 1);
    // Enregistrer les erreurs dans un fichier de log
    ini_set('log_errors', 1);
    // Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
    ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
    // Afficher les erreurs et les avertissements
    error_reporting(e_all);
    ?>
<?php
//include '/home/cliquede/www/libs/envoi_anniv.php'
$quant = date("z"); // Quantième du jour dans l'année. NB: le 01/09/AAAAA est le 245è jour de l'année
// Si l'on est avant le 01/09, l'année d'adhésion ($aadh) est l'année précédente, sinon c'est l'année courante
if($quant < 245) { $aadh = date("Y")-1; } else { $aadh = date("Y"); }
?>

<?php
$DateJour 	= date("m/d");
$mois	    = date('m');  
$jour 	    = date('d');

	$sql = "SELECT nom, prenom, dnaiss, email
			FROM cdc_personnes
				LEFT JOIN cdc_adherer ON cdc_personnes.idpers = cdc_adherer.idpers
			WHERE annee = ?
			AND MONTH(dnaiss) = ?
			AND DAY(dnaiss) = ?";
try{
	$requete = $bdd->prepare($sql);
	$requete->execute(array($aadh,$mois,$jour));
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($aadh,$mois,$jour);
}
	while ($donnees = $requete->fetch()) {
		$anniv_date = $donnees->dnaiss;
		
		if ($DateJour == $anniv_date) {
                $sql1  = "SELECT * FROM cdc_configsite where clef = 'resp'";
                $requete1 = $bdd->prepare($sql1);
                $requete1->execute();
                $reponse1 = $requete1->fetch();
			// Adresse email des destinataires
			$destinataire = $donnees->email;
			// Titre de l'email
			$sujet = 'Joyeux Anniversaire';
			// Contenu du message de l'email
			$message = '<html>';
			$message .= '<body><p>Bonjour '.$donnees->prenom.'<br/>';
			$message .= 'Je te souhaite un bon anniversaire...<br/>';
            $message .= 'A bientôt !<br/>';
            $message .= ''. $reponse1->valeur . '<br/>';
			$message .= '</html>';
			// Pour envoyer un email HTML, l'en-tête Content-type doit être défini
			$headers = 'MIME-Version: 1.0'."\r\n";
			$headers .= 'Content-type: text/html; charset=utf-8'."\r\n";
			$headers .= 'From:"cliquedecruet"<cliquede@60gp.ovh.net>'."\n";
			// Fonction principale qui envoi l'email
			mail($destinataire, $sujet, $message, $headers);
		}
	}
?>	
A voir également:

9 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
4 févr. 2018 à 19:09
Ah la la ... grosses erreur de débutant :-)

Problème de parenthèses...
if ($DateJour == $anniv_date && $anniv['mail'] == 0) {


Mais il serait plus simple de le gérer directement dans ta requête
$sql = "SELECT nom, prenom, dnaiss, email
			FROM cdc_personnes P
				LEFT JOIN cdc_adherer  A ON P.idpers = A.idpers
			WHERE mail = 0
                         AND annee = ?
			AND MONTH(dnaiss) = ?
			AND DAY(dnaiss) = ?";


Sans oublier... lorsque le mail est envoyé .. d'aller mettre cette valeur à 1

Et puis... ta requête pôur récupérer le contenu à envoyer dans le mail....
 $sql1  = "SELECT * FROM cdc_configsite where clef = 'resp'";
                $requete1 = $bdd->prepare($sql1);

place le AVANT ta boucle
ça sert à rien de lancer 50 fois la même requête...

Et pour finir ... où sont de nouveau passé les blocs TRY/CATCH que je te fais ajouter à CHAQUE FOIS ????
Ce n'est pas pour rien qu'il faut les mettre ...


0
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
4 févr. 2018 à 20:04
Donc tu me conseil de faire comme ça même si mon script fonctionne sans que je sois obligé de rajouter un champ ? peut-il y avoir un soucis ?
Par contre le bloc try catch est bien présent dans ma requête je ne comprends pas.
Merci
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
4 févr. 2018 à 20:56

sans que je sois obligé de rajouter un champ

Y'a des fois je me dis que je n'écrit pas suffisamment bien français... :-)
Bien que sûr que si tu dois ajouter un CHAMP. mais au lieu de gérer dans le IF .. tu gères la condition directement dans la requête comme je l'ai fait...


Par contre le bloc try catch est bien présent dans ma requête je ne comprends pas.

Donc pour la n-ieme fois.... il faut mettre un bloc try/catch A CHAQUE REQUETE.
Tu n'en as pas mis pour ta seconde requête...

Bon.. voila ton code revu et corrigé :
<?php
//-----------------------------------------------------------------------------//
//Activation de l'affichage des erreurs PHP
// A placer AU DEBUT de tes scripts... donc AVANT tes includes !
//-----------------------------------------------------------------------------//

// Afficher les erreurs à l'écran
ini_set('display_errors', 1);
// Afficher les erreurs et les avertissements
error_reporting(e_all);
// Enregistrer les erreurs dans un fichier de log
ini_set('log_errors', 1);
// Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
ini_set('error_log', dirname(__file__) . '/log_error_php.txt');


//-----------------------------------------------------------------------------//
//connexion à la bdd
//-----------------------------------------------------------------------------//
require_once("init.php");
    

    
//-----------------------------------------------------------------------------//
//FONCTIONS
//-----------------------------------------------------------------------------//    

   // Fonction qui sert à faire tes requêtes SQL
   // Contient déjà le try/catch
  function executeQuery($sql,$datas=NULL){
    global $bdd; // permet d'utiliser la variable $bdd dans la fonction
    //exécution de la requête
    try{
      $requete = $bdd->prepare($sql);
      $requete->execute($datas);
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
       print_r($aadh,$mois,$jour);
       exit(0); // en cas d'erreur.. arrête le script !
    }
    return $requete;
  }

  function get_Anniv($aadh,$mois,$jour){
  	$sql = "SELECT nom, prenom, dnaiss, email
			FROM cdc_personnes P
			LEFT JOIN cdc_adherer A ON P.idpers = A.idpers
			WHERE mail = 0
      AND annee = ?
			AND MONTH(dnaiss) = ?
			AND DAY(dnaiss) = ?";
    
    return executeQuery($sql,array($aadh,$mois,$jour));
     
  }
    
  function get_configsite_resp(){
    $sql  = "SELECT * FROM cdc_configsite where clef = ? ";
    $result =  executeQuery($sql,array('resp');
    $reponse = $result->fetch();
    return  !empty($reponse) ? $reponse->valeur : '';
  }
    
   
  /**
  * Met le champ "mail" à 1
  */  
  function set_mail_envoye($email){
    $sql = "UPDATE cdc_personnes SET mail = 1 
            WHERE email = ?";
    $datas = array($email);  
    return executeQuery($sql,$datas);
  }
  
   
  function sendMailAnniv($email,$prenom){
      // Adresse email des destinataires
			$destinataire = $email;
			// Titre de l'email
			$sujet = 'Joyeux Anniversaire';
			// Contenu du message de l'email
			$message = '<html>';
			$message .= '<body><p>Bonjour '.$prenom.'<br/>';
			$message .= 'Je te souhaite un bon anniversaire...<br/>';
      $message .= 'A bientôt !<br/>';
      $message .= ''. $resp . '<br/>';
			$message .= '</html>';
			// Pour envoyer un email HTML, l'en-tête Content-type doit être défini
			$headers = 'MIME-Version: 1.0'."\r\n";
			$headers .= 'Content-type: text/html; charset=utf-8'."\r\n";
			$headers .= 'From:"cliquedecruet"<cliquede@60gp.ovh.net>'."\n";
			// Fonction principale qui envoi l'email
			if(!mail($destinataire, $sujet, $message, $headers)){
        echo " Erreur lors de l'envoie du mail !";
      }
  
  }
   
//-----------------------------------------------------------------------------//
// Début de ton script
//-----------------------------------------------------------------------------//    

//include '/home/cliquede/www/libs/envoi_anniv.php'
$quant = date("z"); // Quantième du jour dans l'année. NB: le 01/09/AAAAA est le 245è jour de l'année
// Si l'on est avant le 01/09, l'année d'adhésion ($aadh) est l'année précédente, sinon c'est l'année courante

//if($quant < 245) { $aadh = date("Y")-1; } else { $aadh = date("Y"); }
$aadh =  $quant < 245 ? date("Y")-1 : date("Y"); // même chose que la ligne au dessus.. mais en écriture ternaire...

$mois	    = date('m');  
$jour 	    = date('d');
 
//récupère la liste des anniversaires
$anniv = get_Anniv($aadh,$mois,$jour);
  
 //si il y a des données à traiter
if(!empty($donnees)){
  while ($donnees = $anniv->fetch()) {
    $anniv_date = $donnees->dnaiss;
    $email = $donnees->email;
    $prenom = $donnees->prenom;
    sendMailAnniv($email,$prenom); //envoie le mail
    set_mail_envoye($email); // met le champ "mail" à 1 une fois le mail envoyé au destinataire
  }
}
?>	


Il faut que tu ajoutes un champ "mail" à ta table cdc_personnes une fois le mail envoyé
et faudra penser à tous les remettre à zéro le 1er Janvier de chaque année..
0
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
5 févr. 2018 à 13:38
Bonjour,
J'ai mis en place tes fonctions, je regarde d'où viens le soucis cela ne m'a pas généré le mail.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
5 févr. 2018 à 14:26
Petite erreur de ma part...
Faut modifier le if ...

Modifie cette partie du code :
 //si il y a des données à traiter
if(!empty($anniv)){
  while ($donnees = $anniv->fetch()) {
    $anniv_date = $donnees->dnaiss;
    $email = $donnees->email;
    $prenom = $donnees->prenom;
    sendMailAnniv($email,$prenom); //envoie le mail
    set_mail_envoye($email); // met le champ "mail" à 1 une fois le mail envoyé au destinataire
  }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
5 févr. 2018 à 16:24
Merci je refais un essai...
0
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
5 févr. 2018 à 18:39
Tout fonctionne bien, je vais faire la requète pour modifier le champ mail remettre à zéro au 1er janvier.
Je te remercie.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
5 févr. 2018 à 19:07
Pense à mettre le sujet en résolu.
0
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
5 févr. 2018 à 20:40
Une petite chose, dans la fonction "get_configsite_resp" la valeur resp ne s'affiche pas lors de l'envoi du message...
function get_configsite_resp() {
    $sql  = "SELECT * FROM cdc_configsite WHERE clef = ? ";
    $result =  executeQuery($sql,array('resp'));
    $reponse = $result->fetch();
    return  !empty($reponse) ? $reponse->valeur : '';
}

function sendMailAnniv($email,$prenom) {
    // Adresse email des destinataires
    $destinataire = $email;
    // Titre de l'email
    $sujet = 'Joyeux Anniversaire';
    // Contenu du message de l'email
    $message = '<html>';
    $message .= '<body><p>Bonjour '.$prenom.'<br/>';
    $message .= 'Je te souhaite un bon anniversaire...<br/>';
    $message .= 'A bientôt !<br/>';
    $message .= ''. $resp . '<br/>';
    $message .= '</html>';
    // Pour envoyer un email HTML, l'en-tête Content-type doit être défini
    $headers = 'MIME-Version: 1.0'."\r\n";
    $headers .= 'Content-type: text/html; charset=utf-8'."\r\n";
    $headers .= 'From:"cliquedecruet"<cliquede@60gp.ovh.net>'."\n";
    // Fonction principale qui envoi l'email
    if(!mail($destinataire, $sujet, $message, $headers)) {
        echo " Erreur lors de l'envoie du mail !";
    }
}
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
5 févr. 2018 à 21:51
Encore une petite modif

//récupère la liste des anniversaires
$anniv = get_Anniv($aadh,$mois,$jour);

//récupère resp
  $resp = get_configsite_resp();

 //si il y a des données à traiter
if(!empty($anniv)){
  while ($donnees = $anniv->fetch()) {
    $email = $donnees->email;
    $prenom = $donnees->prenom;
    sendMailAnniv($email,$prenom,$resp); //envoie le mail
    set_mail_envoye($email); // met le champ "mail" à 1 une fois le mail envoyé au destinataire
  }
}


et dans la fonction sendMailAnniv
function sendMailAnniv($email,$prenom,$resp) {
    // Adresse email des destinataires
    $destinataire = $email;
    // Titre de l'email
    $sujet = 'Joyeux Anniversaire';
    // Contenu du message de l'email
    $message = '<html>';
    $message .= '<body><p>Bonjour '.$prenom.'<br/>';
    $message .= 'Je te souhaite un bon anniversaire...<br/>';
    $message .= 'A bientôt !<br/>';
    $message .= ''. $resp . '<br/>';
    $message .= '</html>';
    // Pour envoyer un email HTML, l'en-tête Content-type doit être défini
    $headers = 'MIME-Version: 1.0'."\r\n";
    $headers .= 'Content-type: text/html; charset=utf-8'."\r\n";
    $headers .= 'From:"cliquedecruet"<cliquede@60gp.ovh.net>'."\n";
    // Fonction principale qui envoi l'email
    if(!mail($destinataire, $sujet, $message, $headers)) {
        echo " Erreur lors de l'envoie du mail !";
    }
}

0
LaChaux78 Messages postés 564 Date d'inscription lundi 25 juillet 2016 Statut Membre Dernière intervention 31 mars 2023 32
6 févr. 2018 à 09:04
Bonjour, tout fonctionne très bien.
Je te remercie.
Cordialement
0