Barthezz
(Barthezz)
18 Kwiecień 2009 14:28
#1
Witam.
Posiadam bazę 65 000 adresów email.
Skrypt wykonuje się o ile dobrze kojarzę 45 sekund więc nie zdąży wysłać wszystkiego w tym czasie.
Jak mogę wysłać do nich email tak żebym nie musiał dzielić bazy albo ustawiać limitów?
Napisałem coś takiego:
<?php
$db = mysql_connect("localhost", "login", "haslo");
mysql_select_db("mailing");
$query = "SELECT * FROM maile LIMIT 0 , 1000";
$result = mysql_query($query);
while($row = mysql_fetch_row($result)){
echo $row[1].'
';
$tresc = 'TREŚĆ';
mail("$row[1]" , "TYTUŁ" , "$tresc" , "From: adres email");
}
?>
Z tym, że musiałbym utworzyć 65 takich plików różniących się limitem: LIMIT 0 , 1000 ; LIMIT 1001 , 1000 ; LIMIT 2002 , 1000 itd…
dwukwiat
(Bikerman)
18 Kwiecień 2009 22:18
#2
<?php
$db = mysql_connect("localhost", "login", "haslo");
mysql_select_db("mailing");
$query = "SELECT * FROM maile LIMIT 0 , 1000";
$result = mysql_query($query);
$i=0;
while($row = mysql_fetch_row($result)){
echo $row[1].'
';
$tresc = 'TREŚĆ';
mail("$row[1]" , "TYTUŁ" , "$tresc" , "From: adres email");
$i++;
if($i%1000==0)sleep(60);// pauza 60 sekund co 1000 rekordów
}
?>
Barthezz
(Barthezz)
19 Kwiecień 2009 06:31
#3
Teoretycznie działałoby po usunięciu limitu ale przecież skrypty na serwerach wykonują się maksymalnie do 60 sekund więc ta metoda się nie nada do niczego.
dwukwiat:
<?php $db = mysql_connect(“localhost”, “login”, “haslo”); mysql_select_db(“mailing”); $query = “SELECT * FROM maile LIMIT 0 , 1000”; $result = mysql_query($query); $i=0; while($row = mysql_fetch_row($result)){ echo $row[1].’ '; mail("$row[1]" , “TYTUŁ” , “$tresc” , “From: adres email”); $i++; if($i%1000==0)sleep(60);// pauza 60 sekund co 1000 rekordów } ?>
jak już coś takiego robisz to
$tresc = 'TREŚĆ';
powinno być przed pętlą while
myślę że zdecydowanie lepiej wysłać to za pomocą połączenia z pocztą przez SMTP
skorzystaj może z tej biblioteki swiftmailer.org jeśli miałbyś problem pisz
Barthezz
(Barthezz)
19 Kwiecień 2009 15:49
#5
Mało po polsku jest o swiftmailer i nie dam sobie z tym rady a strona swiftmailer.org nie działa więc ciężko.
Wymyśliłem coś takiego żeby dodać w pętli linijkę
mysql_query("DELETE FROM maile WHERE warunek");
Która będzie usuwała adresy gdzie mail został wysłany i co minutę będę uruchamiał skrypt ponownie.
Co o tym myślicie?
Twój pomysł nie jest najgorszy ale pomyśl logicznie, Twój problem: muszisz jakoś przechowywać index ostatniego wysłanego elementu bo skypt naraz wszystkiego nie wyśle. Rozwiązanie nasuwa się samo - musisz jakoś przechowyac id. Może to być plik textowy, ostatni rekord w tej tabeli, nowa tabela. Na początku skrypt odczyta aktualny ID (na początku 0) wyśle dane 200 razy, zapisze ostatni id (załóżmy 200) i uruchomi się znów(cron jobs).
no to może jak masz już strukturę tabeli z emailami:
id, email, to dodaj status (0,1) gdzie 0 jeden nie wysłany a 1 wysłany,
do tego dajesz po pętli zapytanie modyfikując pobraną listę rekodów zmieniając status z 0 na 1
Barthezz
(Barthezz)
19 Kwiecień 2009 18:03
#9
i po minucie uruchamiać ponownie? albo w cronie zrobic?
Niewiele z cronem miałem do czynienia więc mimo, że to najlepsze rozwiązanie chcę z niego skorzystać ostatecznie.
Równie dobrze możesz sobie poklikać te 20 razy (odświerzać).
A w ogóle używanie Crona nie jest takie trudne, zależy jaki panel admina jest na danym hostingu ale na cpanel jest całkiem nice.