Envoi de mail pour Anniversaire [Résolu]

LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 4 févr. 2018 à 18:29 - Dernière réponse : LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention
- 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);
		}
	}
?>	
Afficher la suite 

11 réponses

Répondre au sujet
jordane45 19959 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 4 févr. 2018 à 19:09
0
Utile
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 ...


Commenter la réponse de jordane45
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 4 févr. 2018 à 20:04
0
Utile
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
Commenter la réponse de LaChaux78
jordane45 19959 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 4 févr. 2018 à 20:56
0
Utile

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..
Commenter la réponse de jordane45
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 5 févr. 2018 à 13:38
0
Utile
1
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.
jordane45 19959 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 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
  }
}
Commenter la réponse de LaChaux78
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 5 févr. 2018 à 16:24
0
Utile
Merci je refais un essai...
Commenter la réponse de LaChaux78
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 5 févr. 2018 à 18:39
0
Utile
1
Tout fonctionne bien, je vais faire la requète pour modifier le champ mail remettre à zéro au 1er janvier.
Je te remercie.
jordane45 19959 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 5 févr. 2018 à 19:07
Pense à mettre le sujet en résolu.
Commenter la réponse de LaChaux78
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 5 févr. 2018 à 20:40
0
Utile
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 !";
    }
}
Commenter la réponse de LaChaux78
jordane45 19959 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 14 février 2018 Dernière intervention - 5 févr. 2018 à 21:51
0
Utile
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 !";
    }
}

Commenter la réponse de jordane45
LaChaux78 224 Messages postés lundi 25 juillet 2016Date d'inscription 13 février 2018 Dernière intervention - 6 févr. 2018 à 09:04
0
Utile
Bonjour, tout fonctionne très bien.
Je te remercie.
Cordialement
Commenter la réponse de LaChaux78