tester que les mails ont été envoyés

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : tester que les mails ont été envoyés

l'opérateur ternaire... bin oui

par emilie1955 » 20 nov. 2006, 15:29

Cool les gars... merci beaucoup. :)

Et ça ne marche !

J'avais lu ça quelque part dans un de mes bouquins, mais je ne l'avais pas mis en application.... puis j'ai oublié.

Bonne semaine à vous tous chers développeurs, et merci encore pour vos judicieux conseils et votre grande générosité.

par albat » 19 nov. 2006, 18:08

Prem's ! :langue:

par Cyrano » 19 nov. 2006, 18:06

par albat » 19 nov. 2006, 18:06

Le point d'interrogation, c'est mon petit chéri à moi : l'opérateur ternaire. ;)

http://www.phpfrance.com/forums/voir_sujet-14111.php

Merci Cyrano

par emilie1955 » 19 nov. 2006, 18:05

Cyrano...

t'as raison, comme ça mon script marche très bien.

Une chose m'intrigue...

J'avais cette déclaration pour ma variable $envoyer
$envoyer = $_POST['envoyer'];
et toi tu mets:
$envoyer = isset($_POST['envoyer']) ? $_POST['envoyer'] : "";
Je ne comprends pas le ? entre les deux déclarations... j'ai jamais codé comme ça... tu peux m'expliquer ?

Merci encore... c'est un cadeau pour moi tout ce bel apprentissage.

par Cyrano » 19 nov. 2006, 17:31

Il semble qu'il manque une accolade de fermeture dans ton script. En outre, je te propose une petite modification :
<?php
$envoyer        = isset($_POST['envoyer']) ? $_POST['envoyer'] : "";
$liste          = '../result.lst';
$inscrits       = file_get_contents($liste);
$tableau        = explode('|',$inscrits);
$fichier_texte  = 'newsletter/malettre.txt';
$sujet          = 'Des nouvelles de mon client';
$entete         = 'From: Le client <[email protected]>' . "\r\n";
$nombre         = (count($tableau)-1);

if (($envoyer =='non') || ($envoyer==''))
{
    echo 'vous avez choisi de ne pas envoyer la lettre tout de suite';
}
if (($envoyer=='oui') && (strlen($fichier_texte)>=1))
{
    $ouvrir = fopen ($fichier_texte, "rb");  // ouverture du fichier
    $contenu = fread ($ouvrir, filesize ($fichier_texte)); // lecture fichier stockage dans la variable contenu
    fclose ($ouvrir); // fermeture du fichier

    $contenu .="\r\n";
    $contenu .= "Pour vous désinscrire de la lettre d'info allez à cette page : http://www.client.com/desabonner.php";
    $message = $contenu;  // ici je change de nom de variable parce que j'avais un autre traitement que j'ai enlevé par la suite.
    $reussi = 0;
    $rate   = 0;
    for ($i = 0; $i < count($tableau); $i++)
    {
        $envoi = mail($tableau[$i], $sujet, $message, $entete);

        if ($envoi == true)
        {
            $reussi++;
        }
        else
        {
            $rate++;
        }
    }
    if($reussi > 0)
    {
        echo "<h3 align='center'>vous avez envoyé ce message à ". $reussi ." inscrits.</h3>";
        echo "<table width=\"60%\" border=\"0\" align=\"center\" cellpadding=\"5\" ".
        "cellspacing=\"0\" bgcolor=\"#E2E1D9\">";
        echo "  <tr>";
        echo "    <td>". $message ."</td>";
        echo "  </tr>";
        echo "</table>";
        if($reussi != $nombre && $rate != $nombre)
        {
            /* Quelques échecs ont eu lieu pour certains envois */
            echo "<h3>L'envoi de la newsletter a partiellement échoué pour ". $rate ." destinataires.</h3>  ";
        }
    }
    else
    {
        /* Aucun envoi n'a réussi */
        echo "<h3>L'envoi de la newsletter a échoué.</h3>  ";
    }
}
?>
En fait, j'ai déplacé le résultat en dehors de la boucle d'envoi et dans cette dernière, j'ai ajouté des compteurs qui te permettront de voir si l'envoi a totalement, partiellement ou pas du tout réussi. À tester, je ne l'ai pas essayé.

zut... ça ne va pas

par emilie1955 » 19 nov. 2006, 17:07

Albat... j'ai testé dans mon script et je reçois les 2 messages, comme si $envoi valait TRUE et FALSE en même temps.

J'ai quelques if imbriqués dans mon script... je crois que le mieux est que je le colle au complet ici.
$envoyer = $_POST['envoyer'];
$liste      = '../result.lst';
$inscrits   = file_get_contents($liste); 
$tableau    = explode('|',$inscrits); 
$fichier_texte = 'newsletter/malettre.txt';
$sujet = 'Des nouvelles de mon client';
$entete = 'From: Le client <[email protected]>' . "\r\n";
$nombre = (count($tableau)-1);

if (($envoyer =='non') || ($envoyer==''))
{
echo 'vous avez choisi de ne pas envoyer la lettre tout de suite';
}
if (($envoyer=='oui') && (strlen($fichier_texte)>=1))

{ $ouvrir = fopen ($fichier_texte, "rb");  // ouverture du fichier
$contenu = fread ($ouvrir, filesize ($fichier_texte)); // lecture fichier stockage dans la variable contenu
fclose ($ouvrir); // fermeture du fichier

$contenu .="\r\n";
$contenu .= "Pour vous désinscrire de la lettre d'info allez à cette page : http://www.client.com/desabonner.php";
$message = $contenu;  // ici je change de nom de variable parce que j'avais un autre traitement que j'ai enlevé par la suite.

for ($i=0;$i<count($tableau);$i++)
{

  $envoi = mail($tableau[$i], $sujet, $message, $entete);

if ($envoi==true)  
   {  echo "<h3 align='center'>vous avez envoyé ce message à $nombre inscrits.</h3>";
      echo "<table width=\"60%\" border=\"0\" align=\"center\" cellpadding=\"5\"
       cellspacing=\"0\" bgcolor=\"#E2E1D9\"><tr><td>$message</td></tr></table>";
   }  
   else { echo "<h3>L'envoi de la newsletter a échoué.</h3>  "; }
}
Pour commencer, je vois que le script affiche Vous avez envoyé.... autant de fois que j'ai d'adresses dans mon fichier texte.

Il affiche aussi: L'envoi de la newsletter a échoué.

Si je change le dernier } de place et que je le mets où il devrait être (il me semble) avant le dernier if, là le script se comporte comme si la fonction mail() avait échouée. Pourtant, je reçois bien le mail.

Alors j'ai décidé de tester ton bout de script sans tous les autres tests que je fais ici.
$envoi = mail($destinataire, $sujet, $message);
if ($envoi==true)  
   { echo "<h4>Envoi effectué</h4> <b>$sujet</b> <br><br> $message";
   }  
   else  
   { echo "Envoi échoué";  
   } 
Comme ça ça marche... mais pas dans mon script.

Ouskecé que j'me suis trompée ? (en jargon québécois, ouskecé signifie simplement où)

Merci encore pour ta précieuse aide Albat...

par albat » 18 nov. 2006, 19:05

Si tout va bien concernant cette question, peux-tu clore ce sujet en le mettant "Résolu" ? ;)

Albat... t'es mon meilleur :o)

par emilie1955 » 18 nov. 2006, 17:36

Albat... j'suis donc contente que tu me répondes de cette façon. Sans avoir jamais suivi aucun cours en prog j'ai souvent de la misère à comprendre la poutine de base... et la base c'est essentiel.

Je m'empresse de pratiquer le concept et je continue d'apprendre grâce à vous tous.

Merci encore !

par albat » 16 nov. 2006, 15:57

Une fonction a un double effet.
Le lapin ! Le lapin !...

Elle effectue une action (ou une série d'actions) ET renvoie une valeur.

L'instruction :
$envoi = mail($tableau[$i],$sujet,$message,$entete);
aura donc pour effet :
- d'envoyer un mail avec les paramètres indiqués
- de donner à la variable $envoi la valeur correspondant à la bonne exécution de la fonction mail() : true ou false.

encore besoin de votre aide

par emilie1955 » 16 nov. 2006, 15:51

Merci Albat pour ta réponse, mais j'utilise un fichier texte pour mon tableau d'adresses email, il n'y a qu'une colonne... j'ai beaucoup d'autres scripts qui fonctionnent sur ce principe (je ne souhaite pas les refaire).

Plus haut tu m'offrais ce bout de code:
$envoi = mail($tableau[$i], $sujet, $message, $entete);  
if ($envoi==true) 
   { echo "Envoi effectué"; 
   } 
   else 
   { echo "Envoi échoué"; 
   }
et moi j'ai déjà:
for ($i=0;$i<count($tableau);$i++) 
  { 
  mail($tableau[$i],$sujet,$message,$entete); 
  }
Ce que je comprends, c'est que tu mets la fonction mail() dans une variable $envoi

Comment je fais pour exécuter la fonction mail ? est-ce que je fais juste insérer ton script sous le mien et ça marche ou bien la lettre va-t-elle partir 2 fois ?

Dois-je faire un echo $envoi pour lancer la fonction ?

Encore merci j'apprends beaucoup ici.

par albat » 12 nov. 2006, 12:05

Pour ma part, je fonctionne différemment.

J'ai, dans ma table d'abonnés, un champ envoye dont la valeur est par défaut : 0.
Lorsque je procède à l'expédition de mes mails, j'inscris la valeur de ma variable $envoi.
if ($envoi)
   { $req = "UPDATE abonnes A SET A.envoye = 1 WHERE A.num_abonne = ".$num_abo;
     // ...
   }
Lorsque toute la colonne envoye ne contient que des 1, tous mes mails ont été envoyés.

Je n'ai plus qu'à la remettre à 0 pour un prochain envoi.

mais encore...

par emilie1955 » 12 nov. 2006, 06:26

Ajoloca tu dis...

Tu peux utiliser un fichier de log dans lequel tu inscrit le nombre d'e-mail envoyés (départ à 0 et +1 à chaque envoi)

Je fais ça comment ? une piste de départ svp

Merci encore

par Ajoloca » 12 nov. 2006, 02:49

Bonsoir,

Tu peux utiliser un fichier de log dans lequel tu inscrit le nombre d'e-mail envoyés (départ à 0 et +1 à chaque envoi)

Si tu as accès au serveur, augmenter la valeur de la directive 'max_execution_time' dans php.ini ou bien dans un fichier .htaccess. Voir en un premier temps combiner les deux pour estimer le temps.

Une méthode, pas très fiable(dépend de la charge du serveur) est de contrôler le temps nécessair pour envoyer par exemple 50 e-mails, ça te donnera une idée du temps nécessaire. (utilise pour ça la fonction microtime() de PHP)

pour savoir si tous les emails sont partis

par emilie » 12 nov. 2006, 02:11

Merci pour les informations... en fait je veux juste savoir comment on peut savoir que tous les emails ont été envoyés... parce que si le timeout du serveur se termine avant que tous les emails soient partis... comment je le saurai ?

Actuellement j'ai une variable qui me permet d'afficher à la fin du script, combien il y a d'inscrits dans ma lettre.
$nombre = (count($tableau)-1);
Vu que je ne suis pas très familière en php, je ne sais pas trop comment utiliser la fonction mail() pour faire le test à savoir si a bien envoyé tous les emails.

Voici comment s'envoie ma lettre:
for ($i=0;$i<count($tableau);$i++) 
  { 
  mail($tableau[$i],$sujet,$message,$entete); 
  }
Merci encore