Envoyer une newsletter a partir d'un serveur mutualisé

WRInaute accro
Bonjour,

Je dois envoyer 3000 newsletters a partir d'un serveur mutualisé

******** caracteristiques **********
Le poid html du mail est de 35ko
pas droit aux copies cachées
droit aux taches crons
+ 20 enregistrements supplémentaires par jour
******************************

Je pensais faire comment ca:
- 10 scripts qui vont prendre en compte 10% chacun des enregistrements a traiter
- 8 apel par script ( tache crons toute les heures 00.00h -> 07.00h)

Ce qui fait 8*10 = 80 taches

Donc avec 3000 mails :
3000 / 80 = 38 traitements par script

1° je suis parano et je peux envoyer 3000 mails d'un coup avec set_time_limit(0) ?
2° Mon idée est pas si mal et à votre avis, je peux monter jusqu'à combien de traitement par script pour le futur: 100, 200, 500 ?
3° cela ne va t-il pas poser des problèmes de répartir 3000 mails de cette manière pour le serveur mail ? genre spam ? Ou inversement c'est très bien comme méthode ?
 
WRInaute impliqué
Moi sur un site je le fais avec wanewsletter pour 3500 dest sur un 60gp avec mail a chaque destinataire (pas de copies cachées )

faut regler a environ 300 dest par envoi ce qui fait qu'il faut cliquer une bonne dizaine de fois sur envoyer le flot suivant ... mais ca passe impecable
 
WRInaute accro
ajaaaax.
chaque minute, le script lance l'envoi à 100 destinataires (1 à 1). tu laisse la fenetre ouverte et l'appli ajax tourner :)
 
WRInaute accro
ludoanimation a dit:
Moi sur un site je le fais avec wanewsletter pour 3500 dest sur un 60gp avec mail a chaque destinataire (pas de copies cachées )

faut regler a environ 300 dest par envoi ce qui fait qu'il faut cliquer une bonne dizaine de fois sur envoyer le flot suivant ... mais ca passe impecable

je suis sur un 90 plan mais je ne pense pas que cela change grand chose. Donc si j'installe mon systeme, je pourrais le monter jusqu'a 300 traitements
ce qui fait -> 300*80 = 24 000 traitements

ca me va, cela me laissse quelques années tranquille devant moi :D

e-kiwi a dit:
ajaaaax.
chaque minute, le script lance l'envoi à 100 destinataires (1 à 1). tu laisse la fenetre ouverte et l'appli ajax tourner

je préfère passer 10 heures de plus aujourd'hui à developper 1 script que 300 heures dans les mois à venir à regarder une fenetre Internet se reloader, sans compter qu'entre le serveur et ma fenêtre, les bytes ont 7000 bornes à se taper :mrgreen:
 
WRInaute discret
tu peux par contre créer ton propre script AJAX qui s'occupera de cliquer pour toi sur le bouton SUIVANT :p

En gros tu crée un objet ajax qui lance ton script PHP qui est censé envoyé 100 mail.. sur le Oncomplete, tu relance le meme script en boucle avec a chaque fois des parametre différents (identifiant du client correspondant au premier mail a envoyé et nombre de client suivant)

oublie pas de lancer un EVENT onFinish dans le cas ou tu es arrivé au dernier client sinon le script va se taper une boucle infini :p
 
WRInaute accro
ca me soule ajax puis j'ai pas mis 10 heures mais 3 heures en partant de zero et je l'ai rendu portable au maximum pour ceux que cela interresse
ce systeme permet d'envoyer environ jusqu'a 30 000 newsletters individualisés, tout dans le meme placard chez l'hebergeur, et un envoi étalée sur 10 heures.
Je suis parti sur une base de 10.
10 scripts * 10 heures.
Cela fait 100 traitememts

De quoi partir en vacances tranquille pendant que php travaille pour nous ;)

Code:
/*
1° creer les 2 tables

CREATE TABLE `newsletter_liste` (
  `id` int(255) NOT NULL auto_increment,
  `email` varchar(150) NOT NULL default '',
  `nom` varchar(255) NOT NULL default '',
  `membre` int(3) NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00',
  `numero` varchar(100) NOT NULL default '0',
  PRIMARY KEY  (`email`),
  KEY `id` (`id`)
) ENGINE=MyISAM;



CREATE TABLE `newsletter_positions_id` (
  `pos` int(11) NOT NULL default '1',
  `ch1` tinyint(3) unsigned NOT NULL default '1',
  `ch2` tinyint(3) unsigned NOT NULL default '1',
  `ch3` tinyint(3) unsigned NOT NULL default '1',
  `ch4` tinyint(3) unsigned NOT NULL default '1',
  `ch5` tinyint(3) unsigned NOT NULL default '1',
  `ch6` tinyint(3) unsigned NOT NULL default '1',
  `ch7` tinyint(3) unsigned NOT NULL default '1',
  `ch8` tinyint(3) unsigned NOT NULL default '1',
  `ch9` tinyint(3) unsigned NOT NULL default '1',
  `ch10` tinyint(3) unsigned NOT NULL default '1'
) ENGINE=MyISAM;


2° mettre a jour la table newsletter_liste la vieille avec un CRON
   c'est ici que vous allez chercher les emails d'une autre table pour les mettre dans cette table
   des problemes pour le faire ? je vous passes mon alog ;)
   j'ai mis 1 drop + create pour etre sur que les ID recommence bien a partir de 0

mysql_query("DROP TABLE newsletter_liste");
mysql_query("CREATE TABLE newsletter_liste (
  id int(255) NOT NULL auto_increment,
  email varchar(150) NOT NULL default ''
  PRIMARY KEY  (email),
  KEY id (id)
) ENGINE=MyISAM;");



3° mettre a jour la table newsletter_positions_id la vieille avec un CRON
   rien de particulier sauf que la table newsletter_positions_id doit abolument etre a jour
   avant de lancer les scripts

<?php
// mise jour de la table newsletter_positions_id
mysql_query("DELETE FROM newsletter_positions_id");
mysql_query("INSERT INTO newsletter_positions_id (pos, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10) VALUES (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)");
?>

4°
placer 10 scripts avec le code.

LA SEULE CHOSE A MODIFIER va etre la variable $position

le script n°1 aura $position = 1;
le script n°2 aura $position = 2;
le script n°3 aura $position = 3;
..
le script n°10 aura $position = 10;


5° aller sur votre planificateur de taches, ajouter chaque script 1 par 1 avec 10 apel par script
0h -> 10h

enjoy ;)


*/

/******************************************************************************* 
    * connection sql 
    ***************************************************************************/ 
$connection = mysql_connect("localhost","root","motdepasse"); 
if ( ! $connection ) 
die ("connection impossible");  
$mabasededonnee="Client"; 
mysql_select_db($mabasededonnee) or die ("pas de connection");  

$table_sql = "";  // nom de votre table 

/*******************************************************************************
    * position, A MODIFIER selon le n° du script
    ***************************************************************************/

$position = 1;  // 1 -> 10

/******************************************************************************* 
    * code  NE RIEN MODIFIER A PARTIR DE LA SAUF LA COMMANDE MAIL() bien sur ;)
    ***************************************************************************/

$base = 10;

// nom du champ
$champ_sql_position = "ch$position";
// recherche la derniere position
$q = mysql_query("SELECT ".$champ_sql_position." FROM newsletter_positions_id WHERE pos=1"); // requete
$r = mysql_fetch_array($q);
// la derniere position connu 1 -> 10
$facteur_dernier_id = $r[$champ_sql_position];

// le nombre d'enregistrement
$q1 = mysql_query("SELECT id FROM newsletter_liste"); // requete
$nombre_enregistrements = mysql_num_rows($q1);
// on arrondi a la centaine
$nombre_enregistrements = round($nombre_enregistrements, -2);
// cherche le nombre d'enregistrement a traiter
// donc 10 scripts, cela fait nbre enregistrements / 10

$new_nombre_enregistrements = $nombre_enregistrements / $base;

// combien de traitement a faire a chaque fois ?
// puisque le script est apelé 10, ca sera / 10

$nombre_de_traitements = $new_nombre_enregistrements / $base;

// on va chercher ou pointe le premier id
// on va d'abord regarder ou il commence

$premier_id = $new_nombre_enregistrements * $position;
$supplement = $nombre_de_traitements * $facteur_dernier_id;
$dernier_id =  $premier_id + $supplement;
$dernier_id = $dernier_id - $new_nombre_enregistrements;
$dernier_id = $dernier_id - $nombre_de_traitements;
// Le premier id sera donc $dernier_id

$id = round($dernier_id);
$i = 0;
while ($i < $nombre_de_traitements )
{
   $q2 = mysql_query("SELECT email FROM newsletter_liste WHERE id=$id"); // requete
   $r2 = mysql_fetch_array($q2);
   $e_mail = $r2['email'];


      // envoie de mail personnalisé
      //  mail();

      echo $e_mail;
      echo ' - ';
      echo $id;
      echo '<br />';

   $id++;
   $i++;
 }
// mise a jour de la position
mysql_query("UPDATE newsletter_positions_id SET ".$champ_sql_position."=".$champ_sql_position."+1 WHERE pos=1");
//exit();
?>



Au moment de vos tests, vous devriez en lancant le script avec 10% de 10% des enregistrements de votre base voir apparaitre les enregistrements concernés. en recliquant, vous devriez voir les enregistrements suivant concernés et ainsi de suite.
 
WRInaute discret
hum.. tu parle de CRON dans ton script.

tu es donc sur un serveur dédié ?

Si oui tu as la main sur la limite d'execution de script ?

du coup ton script sert a rien ?
 
WRInaute accro
bixi a dit:
hum.. tu parle de CRON dans ton script.

tu es donc sur un serveur dédié ?

Si oui tu as la main sur la limite d'execution de script ?

du coup ton script sert a rien ?

ce systeme est pour du mutualisé

titi63 a dit:
Ya pas de risques de fermeture du compte pour 300 dest par envoi???

non, ca passe ou ca passe pas, c'est tout.

Tu peux te faire fermer un compte mail si il y a plus de 3 personnes qui porte plainte pour spam sur le même envoi de mail.
 
Discussions similaires
Haut