tester que les mails ont été envoyés

Eléphanteau du PHP | 21 Messages

10 nov. 2006, 18:46

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.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

10 nov. 2006, 18:51

$envoi = mail($tableau[$i], $sujet, $message, $entete); 
if ($envoi==true)
   { echo "Envoi effectué";
   }
   else
   { echo "Envoi échoué";
   }

Eléphant du PHP | 187 Messages

11 nov. 2006, 00:28

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 nov. 2006, 00:38

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... :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 nov. 2006, 09:40

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).

emilie
Invité n'ayant pas de compte PHPfrance

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

ViPHP
ViPHP | 1961 Messages

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)
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphanteau du PHP | 21 Messages

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

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

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.

Eléphanteau du PHP | 21 Messages

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.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

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.

Eléphanteau du PHP | 21 Messages

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 !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

18 nov. 2006, 19:05

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

Eléphanteau du PHP | 21 Messages

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...

Mammouth du PHP | 19672 Messages

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é.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: