[Qst] - Timing sur envoi de mail...

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 : [Qst] - Timing sur envoi de mail...

par casio » 22 juin 2009, 13:04

Merci à tous, j'ai mis ça, et ça marche :
<html>
<head>
<title>Envoyer le mailing 'Destockage'</title>
<?php
include("ml-parametres.php");      
	$connexion = mysql_connect("$chemin_db" , "$login" , "$pass");
	$sql = "SELECT * FROM $table";
	$result = mysql_db_query($database , $sql , $connexion);

	while($resultat = mysql_fetch_array($result))
	{
		set_time_limit(0); // Aucune limite de temps d'execution de script


	$objet = "[WDA] - mailing 'Destockage'...";
	
	$message = "$messag\n\n\n
	Association WDA, préservation du patrimoine numérique\n\n
	Cliquer ici pour se désabonner du mailing 'Destockage' :\n$site/ml-desabonnement.php?email=$resultat[email]";
        
 	$headers = "From: $nom_du_site <$votreemail>\n";
	$headers .= "X-Sender: <$votreemail>\n";
	$headers .= "X-Mailer: PHP\n"; 
	$headers .= "Return-Path: <$votreemail>\n";  

	//$headers .= "Content-Type: text/html; charset=iso-8859-1\n"; 
	
	mail("$resultat[email]", $objet, "$message", $headers); // Envoi du mail
	echo "<br />Mail envoyé à ".$resultat[email]; // Confirmation visuelle
        }
?>

</head>

<body>
<br /><br />
Mailing 'Destockage' envoyé !

</body>

</html>

par thehawk » 27 mai 2009, 13:03

Pour ton souci de test , tu peux en quelque sorte "skouiser" l'envoi de mail

en faisaint par exemple un sorte de fichier de log par exemple :

function putLog($flux , $email , $statut)
{
fwrite ($flux , "\n".'Mail envoye a '.$email.' : '.$statut);
}

$fichier = fopen("mail_test.txt" , "a+");

while(les test et tout)
{
// Ton traitement
putLog($fichier , "Blaaaa" , "Okay");
putLog($fichier , "[email protected]" , "Pas Okay");
}

fclose($fichier);
Enfin ca reste qu'une idée pour éviter d'envoyer le message :)

faut pas oublié de faire :
//mail("$resultat[email]", $objet, "$message", $headers); 
et de mettre en ligne le fichier modifié , au moins pas le souci pour tes clients de recevoir des mails TEST.

Bon aprem Hawk

par Calimero » 27 mai 2009, 10:29

A mon avis, le conseil d'enneite donné plus haut est la meilleure façon d'être sûr que 100% des emails seront envoyés. Pour ce genre de choses set_time_limit() ne suffit pas, il faut vraiment éviter de passer par le web et préférer un script (php ou autres) en ligne de commande.

par casio » 27 mai 2009, 09:30

Merci à tous pour vos conseils... Néanmoins, j'ai une marge de manoeuvre tres reduite. Je ne vais en effet pas pouvoir faire des tests d'envoi sur plus de 650 personnes inscrites et validées... :(

Il me faut du sur qui fonctionne du premier coup...

Stopher à proposé quelque chose qui me plait assez, mais je veux etre sur de ne pas faire d'erreur en l'incluant dans mon code...
Ou dois-je mettre :
while($resultat = mysql_fetch_array($result)) 
    { 
         set_time_limit(20); 
         .... 
     }
Dans mon code initial ?
<?php 
include("ml-parametres.php");       
    $connexion = mysql_connect("$chemin_db" , "$login" , "$pass"); 
    $sql = "SELECT * FROM $table"; 
    $result = mysql_db_query($database , $sql , $connexion); 

    while($resultat = mysql_fetch_array($result)) 
    { 


    $objet = "[WDA] - mailing 'Destockage'..."; 

     
        $message = "$messag\n\n\nCliquer ici pour se désabonner du mailing 'Destockage' :\n$site/ml-desabonnement.php?email=$resultat[email]"; 
         
     $headers = "From: $nom_du_site <$votreemail>\n"; 
    $headers .= "X-Sender: <$votreemail>\n"; 
    $headers .= "X-Mailer: PHP\n";  
    $headers .= "Return-Path: <$votreemail>\n";   

    //$headers .= "Content-Type: text/html; charset=iso-8859-1\n";  
     

    mail("$resultat[email]", $objet, "$message", $headers); 
        } 
?>
Ou plutôt, manque t'il quelque chose ? Cela fonctionnera t'il a tous les coups ?

Merci encore de votre aide...

par enneite » 21 mai 2009, 08:58

alors le mieux, c'est que tu aies un serveur dédié, ton propre serveur.


Un exemple sous windows, i faut surement modifier un peu le script pr linux.
Dans ce cas :
tu te ouvre la ligne de commande, tu te places dans le repertoire ou est situé php:
tu execute php en mettant comme parametre le chemin complet de ton script.
si tu est à la racine du serveur.
C:\
cd Program Files\PHP
@php.exe -q C:\dossier1\dossier2\script.php %1%2%3%4
Après, tu peux automatiser cela en placant ce bout de code dans un fichier.bat (sous windows et un shell sous linux)

Si tu es sur un serveur mutualisé, cela reste envisageable, mais plus compliqué:

il faudra rapatrié tes données sur ton serveur de dev, dans un fichier csv ou .txt. Ensuite, tu installes ton propre serveur SMTP. TU dois reconfigurer php.ini pour preciser son emplacement à php et tu executes la commande ci dessus.
Bref, ça devient plus compliqué quand même!

par casio » 20 mai 2009, 23:55

ou alors tu effeectue ta routine en ligne de commande, en dehors du navigateur.
La tu n'auras plus de problèm de time out...
??? Comment ?

par enneite » 20 mai 2009, 23:06

ou alors tu effeectue ta routine en ligne de commande, en dehors du navigateur.
La tu n'auras plus de problèm de time out...

par stopher » 15 mai 2009, 12:16

Un exemple ?

Et bien , je trouve pourtant que la doc set_time_limit() donne pas mal d'explications là dessus ..

Ce que tu peux faire ,

dans chaque boucle , tu estime que le temps de l'envoie de d'un mail ne peut être supérieur à 20 secondes , tu mets :
while($resultat = mysql_fetch_array($result))
    {
         set_time_limit(20);
         ....
     }
Ainsi , comme l'appel de cette fonction remet les compteurs à zéro , ton script ne se coupera pas , sauf si l'envoie d'un mail bloque plus de 20 secondes .

Tu aurais aussi trés bien pu mettre set_time_limit(0); au tout début de ton script , qui aurait eu l'effet de permettre à ton script de s'executer autant de temps qu'il le souhaite .. mais en cas de blocage , celà peut poser un souci .. je ne conseille vraiment pas cette méthode .

Note: si safe_mode est activé sur ton serveur , set_time_limit(); ne fonctionne pas !

Et comme l'a précisé thehawk, tu peux aussi garder le time_limit par défaut ( qui est de 30 sec ) , mais de découper ton envoi de mails .. ( à toi de définir ta façon de faire ).

Exemple , tu as 500 mails à envoyer , tu lances l'action envoyer tel mail aux 500 adresses , et cette action se met sous forme de "workflow" , ces actions seront donc lancé en décalé dans le temps , via une tache cron par exemple .

Ce qui permet d'étaler la charge de ton serveur , et d'éviter les problèmes de timeout , un peut plus conséquent à mettre en place , mais une solution qui est fréquemment utilisé .

Bonne continuation ,
Ch.

par casio » 15 mai 2009, 11:28

Je suis d'accord avec vous, mais concrètement, un petit exemple ?

par thehawk » 15 mai 2009, 09:28

Ou alors coder une boucle qui envoi par groupe de 50 mails

par stopher » 15 mai 2009, 09:20

Salut ,

Pour modifier le timeout , tu peux utiliser cette fonction :

set_time_limit()

Ch.

[Qst] - Timing sur envoi de mail...

par casio » 15 mai 2009, 02:36

Salutations,

Je viens de créer un mailing inspiré de pas mal d'autres codes.
L'idée est de tenir informés les membres qui le souhaitent par mail 2/3 fois par mois.

Voici mon code d'envoi du mail :
<?php
include("ml-parametres.php");      
	$connexion = mysql_connect("$chemin_db" , "$login" , "$pass");
	$sql = "SELECT * FROM $table";
	$result = mysql_db_query($database , $sql , $connexion);

	while($resultat = mysql_fetch_array($result))
	{


	$objet = "[WDA] - mailing 'Destockage'...";

	
        $message = "$messag\n\n\nCliquer ici pour se désabonner du mailing 'Destockage' :\n$site/ml-desabonnement.php?email=$resultat[email]";
        
 	$headers = "From: $nom_du_site <$votreemail>\n";
	$headers .= "X-Sender: <$votreemail>\n";
	$headers .= "X-Mailer: PHP\n"; 
	$headers .= "Return-Path: <$votreemail>\n";  

	//$headers .= "Content-Type: text/html; charset=iso-8859-1\n"; 
	

	mail("$resultat[email]", $objet, "$message", $headers);
        }
?>
Comment puis-je rajouter une routine pour éviter des timeout sur l'envoi d'un trop gros nombre de mails ? Le dernier test, il n'y eut que 60% des mails qui ont reçus le message.

A vous lire,

Merci... :)