[ kelja @ 25.05.2007. 20:32 ] @
Radim neki real estate sajtic i jedan od zahteva je slanje maila svim korisnicima od strane administratora(direktno iz admin panela).

Ne verujem da ce sajt imati ogroman broj korisnika(sumnjam da ce dogurati i do 300),ali svejedno, ne bih da rizikujem, pa da koristim metod:loop kroz mejlove iz baze +mail()...

Zanima me kakva su vasa iskustva ,koji je najveci broj korisnika(mejlova) koji mail() funkcija moze da 'podnese', ako se radi na ovaj nacin?

Neki forumasi su pisali da za ove svrhe koriste php mailer klasu.Da li biste i vi to preporucili?

Pozdrav!
[ Miroslav Ćurčić @ 25.05.2007. 21:51 ] @
Najvažnije pitanje je "koliko smeš da pošalješ a da ne naljutiš hosting admina" a ne "koliko može da izdrži".

Prvo vidi sa adminitratorom koliko sme, i koji ritam slanja preporučuje, kao i metod (mail(),SMTP,...),
implementacija je tek na drugom mestu.

U principu je dovoljno samo pauzama usporiti slanje i sve će proći.
Preporučujem upotrebu SMTP protokola da izbegao opterećivanje http servera,
na www.swiftmailer.org imaš free klasu koja sve to radi.
[ kelja @ 26.05.2007. 09:17 ] @
Hvala na odgovorima, @mVeliki.
Sad sam dobio podatke od klijenta kako to funkcionise na drugom njegovom sajtu, na istom serveru.
Ima oko 600 korisnika,koristi mail() funkciju,salje se po 50 mejlova(s pauzama izmedju slanja,kako on kaze).

E sad, kako napraviti pauze tokom slanja?Dakle, implementacija :)
Unapred hvala!
[ dakipro @ 26.05.2007. 09:32 ] @
Evo ti jedno glupo resenje, ali pouzdano. Smesti sve mailove u tmp tabelu, posalje prvih 50, odma ih obrisi, ponudi korisniku dugme "Send next 50" pa nek klikne 5 puta, ako nema puno mail-ova, nece mu biti posebno tesko. Ili, naravno, cron, ali ako bi mogao cron da pokrenes onog trenutka ka korisnik posalje prvu turu mailova. Nisam siguran da ovo moze.
[ Nemanja Avramović @ 26.05.2007. 09:44 ] @
Jako je prosto odraditi pauzu. Ovako sam ja radio kod mog CoolMailer-a: U principu je jaaaako slično kao kada radiš paginaciju: Iz baze selektuješ prvih 50 mejlova i pošalješ ih, a onda podesiš meta refresh da otvara tu istu stranicu za 10ak sekundi sa parametrom mail.php?strana=2. Posle toga selektuješ od 51. do 100. adrese i šalješ mejl na te adrese.. onda ideš na ?strana=3 i tako do kraja.
[ kelja @ 26.05.2007. 12:07 ] @
Hvala svima!
[ BitiPrvi @ 19.08.2011. 17:09 ] @
Tema je stara ali i dalje aktuelna.
Molim vas da mi kažete koju php skrptu preporučujete za slanje maila kada su u pitanju sajtovi sa nekoliko hiljada članova?
Šta je dakle ono što "radi posao" a da nije suviše komplikovano?
Hvala.
[ slack3r @ 19.08.2011. 17:54 ] @
http://www.google.ba/search?q=php+newsletter

phplist nije los, pogledaj i ostale
[ Nikola Poša @ 19.08.2011. 18:02 ] @
Pa ti u principu posao možeš da završiš i sa standardnom mail() funkcijom, mada je naravno preporučljivije da to bude neka naprednija biblioteka, kao što je već bezbroj puta spominjani SwiftMailer, koji nudi raznovrsne opcije za slanje email poruka, npr. batch email slanje i mnoge druge.

Ali tu nije u pitanju konkretna PHP biblioteka koja bi se koristila za te namene, već se u te svrhe preporučuje sasvim drugačija arhitektura. Npr. ako imaš case da nakon neke akcije, recimo submit-a neke forme, treba hiljadama korisnika da šalješ email-ove, i to svakom zasebno, a pritom taj sajt/aplikacija ima dosta velik load, onda će taj koji bude submit-ovao tu neku formu morati dosta da se načeka dok njegov browser ne kompletira taj zahtev. U tom slučaju je najbolje mail-ove najpre poslati u neki queue, pa da ih onda neki nezavisan proces šalje kad stigne. E sad to queue može da bude i obična tabela u bazi, pa da onda neki cron samo isčitava tu tabelu i šalje email-ove, ali uglavnom, ideja je to asinhrono slanje poruka. Postoji i jedna PEAR klasa - Mail_Queue, koja radi baš po tom principu. Naravno, još bolja (brža) varijanta su rešenja namenjena baš za ostvarivanje te queueing funkcionalnosti, kao što je Gearman, ili recimo predlog opisan na ovoj stranici, baziran na Zend Server Job Queue-u.
[ BitiPrvi @ 19.08.2011. 23:18 ] @
Citat:
Pa ti u principu posao možeš da završiš i sa standardnom mail() funkcijom,

Trenutno postoji ograničenje, pa prilikom slanja "email all members" mail dobije samo odredjeni broj osoba (do odredjene cifre).
Preko te cifre ostali poslati mailovi se odbacuju "Messages discarded".
Hvala vam na sugestijama.
Nadam se da će još neko ko ima iskustva sa ovim sugerisati nešto efikasno i praktično.
[ peca89bg @ 19.08.2011. 23:25 ] @
ako mail dobije samo odredjeni broj osoba, to jest, postoji ogranicenje.

nije do skripte nego ti je provajder lupio limit.

na primer, ja kod mog provajdera imam ogranicenje na 500 mailova na sat.
inace ako ti to toliko znaci i ako ti je toliko potrebno pogledaj http://sendgrid.com/
[ BitiPrvi @ 20.08.2011. 17:09 ] @
Citat:
nije do skripte nego ti je provajder lupio limit.

na primer, ja kod mog provajdera imam ogranicenje na 500 mailova na sat.

Upravo tako,i upravo zbog toga tražim nešto bolje, jer na ovaj način mail dobije samo deo registrovanih članova, a svi ostali nemaju pojma da je išta poslato.

Ps.
Naravno, provajder mora da postavi limit da bi samog sebe zaštitio da nebi dospeo na "crnu listu" i da se nebi tretirao kao spamer, ili neko ko dozvoljava spam.

[ slack3r @ 20.08.2011. 21:36 ] @
Zasto jednostavno ne postavis da umjesto mail() funkcije puni tabelu npr. mailq gdje imas rcpt-a i id content-a (iz druge tabele)

Postavis onda cron koji ce okidati po 100 ili 50 komada svakih 10 minuta.

Takvo resenje sam radio za jednu banku, gdje cak nisam imao direktan smtp pristup nego sam slao content enkodiran preko njihovog proxy na public server koji je dekodirao i slao korisnicima bez store-anja podataka.



Code:

////////////////////////////////////////////////////////////////////////////////
// GET current count
$set_cnt = mysql_query("SELECT seq from mailq_seq");
$seq_val = mysql_fetch_row($set_cnt);
// Make query and increase
$result = mysql_query("SELECT email,uniq FROM emails LIMIT {$seq_val[0]} , {$seq}");
// Increment sequence
$inc_cnt = mysql_query("UPDATE mailq_seq set seq=seq+{$seq}");
// Loop through mails
while($row = mysql_fetch_assoc($result)) {
        # LOOP MAILS
        $xbody = $body;
        $xbody .= "If u want to unsubscribe from our emails please click <a href='http://www.domain.tld/?unsub=".$row['uniq']."'>here</a>";
        sendIT($xbody, $row[email]);
}
if(mysql_num_rows($result)==0){ @mysql_query("UPDATE mailq_seq set seq=0, cid=''");
                                echo 'Ciklus zavrsen u:'.date('d.m.Y h:i:s A');
                                exit;
}
}else{
    exit;
}
?>
[ ivan.a @ 22.08.2011. 22:48 ] @
Korišćenje mail funkcije u petlji nije preporučljivo. Zašto ne koristiš BCC?

Primer:

Code:
$adrese = array (
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]'
);

//Napravi listu za BCC
$lista = implode("," , $adrese);

//I na kraju slanje maila
mail(
      '[email protected]',
      'Naslov za email',
      'Email poruka',
      "From: [email protected]\r\nBcc: ($lista)"
     );


Dakle, uvek prvo "pripremiš" funkciju ili upit pa tek onda izvršiš van petlje. Isto tako radiš i sa UPDATE funkcijom kada označiš koji su mailovi poslati i datum slanja (pošto je preporučljivo stavljati do 50-100 maila u jednom ciklusu).
UPDATE može da izgleda ovako. Prvo izvučeš mailove korisnika iz baze gde je datum slanja manji od određenog vremena, ili ako koristiš newsletter možeš staviti ID newslettera (last_newsletter_id) i tada tražiš korisnike koji su označeni za slanje tog newslettera (vrednost 1 poslato, vrednost 0 na čekanju za slanje).
Pošalješ 50 mailova i pripremiš upit za UPDATE funkciju.
Code:
UPDATE users SET `last_newsletter_id` = 'ID', `send` = '1', `date` = 'NOW()' 
         WHERE (`user_id` = 1 AND `user_id`=2...i tako 50 ID-eva u svakom ciklusu)
         AND `send` = 0;