Mailing do 65k osób

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…

<?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

    }


?>

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.

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

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

OTy --> Kosz

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.