Newsletter envois par flot

Résolu
mariobotta Messages postés 57 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 12 septembre 2009 - 29 oct. 2005 à 11:05
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 30 oct. 2005 à 23:59
bonjour,
j'ai réalisé un envois d'une newsletter mais je souhaite envoyer les emails par flot de x adresse mail.
Actuellement j'envois tout en une fois pour l'instant cela fonctionne mais en prévision d'avenir il serait idéale d'utilisé l'envoi par flot pour évité le timout php de 30 sec.
Les emails sont dans une base mysql.
Comment puis-je réaliser cela?quelqu'un aurait-il une idée?
merci d'avance pour votre aide

15 réponses

mariobotta Messages postés 57 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 12 septembre 2009
30 oct. 2005 à 22:24
bonsoir,
merci à tous pour votre aide
j'ai commencer un script (toujours en version bêta) mais cela fonctionne le principe est là.
le principe est comme l'affichage de données issue d'une base sur plusieurs pages
voici mon code (brut) si quelqu'un est interesser
<?php
$host = "localhost"; // Host de la base de données
$user = "root"; // Login
$pass = ""; // Mot de passe
$bdd = "journee"; // Nom de la base de données
@mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données");
@mysql_select_db("$bdd") or die("Impossible de se connecter à la base de données");


$currentPage = $_SERVER["PHP_SELF"];
//limit maximum
$limit = 30;//nombre d'email par flot
$pageNum = 0;//init du nombre de page
if (isset($_GET['pageNum'])) {
$pageNum = $_GET['pageNum'];//recupération nombre de page par lien
}
//limit minimum
$debut = $pageNum * $limit;


//requête SQL:
$query = "SELECT email_newsletter FROM newsletter ";
$query_limit = "SELECT email_newsletter FROM newsletter LIMIT $debut,$limit" ;
//exécution de la requête:
$requete = mysql_query($query_limit);
$result = mysql_fetch_assoc($requete);


if (isset($_GET['totalRows'])) {
$totalRows = $_GET['totalRows'];
} else {
//exécution de la requête sur tout email
$all = mysql_query($query);
//nombre total email
$totalRows = mysql_num_rows($all);
}
//arrondi du nombre total d'email par le nombre d'email par envois qui donne le nombre de pages total
$totalPages = ceil($totalRows/$limit)-1;


//gestion variable passer par le lien
$queryString = "";
if (!empty($_SERVER['QUERY_STRING'])) {
//Scinde la chaîne de caractères/variable grace au delimiteur &
$params = explode("&", $_SERVER['QUERY_STRING']);
//creation d'un tableau de paramètre du lien
$newParams = array();
foreach ($params as $param) {
if (stristr($param, "pageNum") == false &&
stristr($param, "totalRows") == false) {
//ajoute un nouveau paramètre au tableau
array_push($newParams, $param);
}
}
if (count($newParams) != 0) {
$queryString = "&" . htmlentities(implode("&", $newParams));
}
}
$queryString = sprintf("&totalRows=%d%s", $totalRows, $queryString);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>envois par flot ok</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>



<?php while ($result = mysql_fetch_assoc($requete)){//while ?>
<?php echo $result['email_newsletter']; ?>
<?php
$from="email_serveur@hotmail.com";
$suj="sujet allo";
$msg="msg allo";
@mail($result['email_newsletter'],$suj,$msg,$from);
?>,
Envoyer

<?php }//while ?>

<?php if ($pageNum < $totalPages) {//if?>
<?php //min() retourne la plus petite valeur numérique parmi les valeurs passées en paramètres. ?>
">Envoyer aux 30 membres Suivant

<?php }//if ?>

</html>
<?php
mysql_free_result($requete);
?>
à créer une table newsletter avec id et email_newsletter en varchar(80) par exemple

voilà un grand merci à tous
3
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 oct. 2005 à 12:32
Salut,



Tu peux éviter le timeout de 30 secondes plus simplement en redéfinissant ce temps avec la fonction set_time_limit():



set_time_limit(60); // limite à 60 secondes

set_time_limit(0); // Pas de limite !!! (danger de bloquer)



l'action de set_time_limit ne va modifier le temps limite d'execution
que pour le script dans lequel elle est appelée. Donc c'est cool :)



clic sur le lien plus haut pour en savoir plus...



A+
0
mariobotta Messages postés 57 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 12 septembre 2009
29 oct. 2005 à 12:52
bonjour,
oui en effet je connais cette fonction mais les hébergeurs ne bloque t il pas par défaut le timeout à 30 sec (chez ovh par exemple)
De ce faite est ce que cette fonction fonctionne t elle?
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
29 oct. 2005 à 13:12
Certainemen pas, tu as raison... Pour preuve, cette citation du site fr.php.net :



<hr size= "2" width="100%"> Avertissement

Notez que set_time_limit() n'a pas d'effet lorsque PHP
fonctionne en mode safe mode. Il n'y a pas d'autre solution que de changer de
mode, ou de modifier la durée maximale d'exécution dans le <tt>php.ini</tt>.





<hr size ="2" width="100%">J'imagine que OVH fonctionne en safe_mode :(

Vérifie-le via phpinfo()





Sinon, tu vas être aobligé d'appeler ton script plusieurs fois, une
fois pour chaque paquet d'envoi... Tu le fait comme tu veux : AJAX,
affichage d'une popup, appelant le script d'envoi de paquet de
newsletter dont la réponse est une redirection vers l'envoi du prochain
paquet... Bref de la bidouille !

Il n'y a guère d'autres solutions.





C'est d'ailleur un gros manque de PHP ça... l'impossibilité de créer
des processus enfants !!! (Ou alors je n'ai pas trouvé le moyen de).
Car avec les processus enfant, tu aurais pu lancer un script par paquet
en arriere plan, puis attendre (ou non) leur fin pour afficher ta
réponse "newsletter envoyées".



POURQUOI IL N'Y A PAS DE FONCTION fork EN PHP ???



désolé, je ne vois pas de "bonne" solution à ton problème.



Bonne chance...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mariobotta Messages postés 57 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 12 septembre 2009
29 oct. 2005 à 13:35
rebonjour,

merci pour ton aide je vais essayer de faire un script pour envoyer par paquet/flot ç la meilleur solution.
Mais si quelqu'un a déjà trouver une solution ou un script utilisant l'envois par flot je suis preneur?

merci à bientot
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
29 oct. 2005 à 18:17
Salut,



perso j'utilise un vieux truc mais qui fonctionne très bien :



vu que mes membres ont un id unique, je compte le nombre de membres
étant abonnés à la newsletter, j'envoie mettons par paquets de 100
mails. J'indique dans un formulaire en method post l'id actuel de début
et l'id actuel de fin, je fous un javascript qui refresh la page
automatiquement et en fonction de l'id de fin je prends les 100 id
suivants.



a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 oct. 2005 à 18:28
Ou alors via un raffraichissement de la page via header().



Ton lien :

mail.php?start_id= 1&end_id=100;



Tu récupères via GET et tu envoies tes mails dans une boucle for().

Une fois ta boucle fini, un petit :

<?php

$start_id = end_id+1;

$end_id+=100;

header ("refresh: 30;url =mail.php?start_id =$start_id&end_id=$end_id");

?>



Sans plus :) Ca se fera tout seul !

D'ailleurs, si ta connection plante, il te suffit d'améliorer mon
concept de base pour pouvoir le faire repondre à peu près la ou il en
était. (genre, tu log dans un fichier où tu en est... ).



Jvais peut-être tester pour voir :)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 oct. 2005 à 18:43
heu ouais pas bête, faut garder le contenu du mail en session par exemple alors :-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 oct. 2005 à 19:12
Encore mieux !

url type :

mail.php?start_id= 1



<?php

session_start();

$max_par_envoi = 100;



if ( isset($_GET['start_id']) ) {

$start_id = $_GET['start_id'];

}elseif ( isset($_SESSION['start_id']) ) {

$start_id = $_SESSION['start_id'];

} else {

$start_id = 1;

}



$end_id = $start_id + $max_par_envoi;



$sql = "SELECT * FROM base LIMIT $start_id,$end_id";

$query = mysql_query($sql);

while ( $data = mysql_fetch_array($query) ) {

mail();

$_SESSION['start_id']
= ( isset($_SESSION['start_id']) ) ? $_SESSION['start_id']++ : 1;

}



$start_id = $end_id + 1;



header ("refresh: 30;url =mail.php?start_id =$start_id");

?>



J'ai fais ca à la va-vite, mais y'a la base du truc quoi ;)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 oct. 2005 à 19:14
j'aurais plutôt enlevé le SELECT * et mis un BETWEEN $startid AND $endid au lieu d'un LIMIT


manque la session pour le message mais bon oui la base est là ;-)
<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 oct. 2005 à 20:15
Bah le SELECT * c'était histoire de remplir quelque chose ;)



Par contre, le Between, j'avais completement zappé que ca existait :D

Et voui, j'ai oublié le message du contenu du mail... quel con =)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 oct. 2005 à 20:22
le between c'est surtout que c'est beaucoup plus rapide que le limit vu que ça utilise l'index



WHERE id BETWEEN $debut AND $fin



tu mets un index unique sur id et hop ça arrache :-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 oct. 2005 à 23:04
j'aime bien ceux qui prennent compte des conseils donnés plus hauts ça fait plaisir ;-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 oct. 2005 à 23:31
Voui, tu as vu :)

J'ai tout de suite pensé à ca =)



Surtout que ma soluc avait l'air fiable :(
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
30 oct. 2005 à 23:59
et la mienne rapide (en plus d'être fiable) lol

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
Rejoignez-nous