Page 1 sur 2

tester que les mails ont été envoyés

Posté : 10 nov. 2006, 18:46
par emilie1955
Bonjour,

Je voudrais tester qu'un email a été envoyé après ce bout de code...

for ($i=0;$i<count($tableau);$i++)
  {
  mail($tableau[$i],$sujet,$message,$entete);
  }

Avez-vous une piste à me suggérer ?

Comme vous l'aurez compris... je débute en PhP.

Merci de votre aide.

Posté : 10 nov. 2006, 18:51
par albat
$envoi = mail($tableau[$i], $sujet, $message, $entete); 
if ($envoi==true)
   { echo "Envoi effectué";
   }
   else
   { echo "Envoi échoué";
   }

Posté : 11 nov. 2006, 00:28
par netsupra
Salut
Cette méthode ne marche pas dans la pratique et je n'ai jamais réussi a trouver une méthode fiable.
J'avais essayé différentes choses pour un script de mailing en masse et cette methode renvoie toujours (sauf dans quelques tres rares cas) que le mail a été envoyé meme si ce n'ets pas le cas...
Netsupra

Posté : 11 nov. 2006, 00:38
par zeus
A mon avis, il faut préciser ce que tu entends par "mail envoyé"

Si tu cherches à savoir si la plateforme SMTP a envoyé correctement le mail, la fonction php mail() te le permet.

Si tu cherches à savoir si le mail est parvenu au compte mail destinataire, cette fonction ne te le permet pas.
Je me demande même si c'est possible, puisque ça pourrait être très facile de chercher les emails existants en envoyant juste un mail de test ... :afraid:

D'une manière générale, il est impossible de savoir de manière sûre si tout les mails envoyés ont été recu, de manière automatique... :?

Posté : 11 nov. 2006, 09:40
par albat
Cette méthode fonctionne très bien mais, comme l'a judicieusement rappelé zeus :
il s'agit d'un accusé d'envoi et non d'un accusé de réception (et encore moins de lecture).

pour savoir si tous les emails sont partis

Posté : 12 nov. 2006, 02:11
par emilie
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

Posté : 12 nov. 2006, 02:49
par Ajoloca
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)

mais encore...

Posté : 12 nov. 2006, 06:26
par emilie1955
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

Posté : 12 nov. 2006, 12:05
par albat
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.

encore besoin de votre aide

Posté : 16 nov. 2006, 15:51
par emilie1955
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.

Posté : 16 nov. 2006, 15:57
par albat
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.

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

Posté : 18 nov. 2006, 17:36
par emilie1955
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 !

Posté : 18 nov. 2006, 19:05
par albat
Si tout va bien concernant cette question, peux-tu clore ce sujet en le mettant "Résolu" ? ;)

zut... ça ne va pas

Posté : 19 nov. 2006, 17:07
par emilie1955
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...

Posté : 19 nov. 2006, 17:31
par Cyrano
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é.