Błąd przy wysyłaniu maila do 2000 osób - php

Witam

Chciałem wysłać maila do 2000 osób i wywaliło mi taki błąd:

Internal Server Error  

The server encountered an internal error or misconfiguration and was unable to complete your request. 

Please contact the server administrator, admin@xxx.pl and inform them of the time the error occurred, and anything you might have done that may have caused the error. 

More information about this error may be available in the server error log.

Co może byc tego powodem…? Moze to ze jest duzo maili?

Jak naprawić problem>?

Może byś się tak pochwalił jak chcesz te maile wysyłać?

Wklej kod, bo tak to sobie można gdybać.

Prawdopodobnie jest blokada serwera przed masowym wysyłaniem maila = obciążaniem go. Takie rzeczy to robi się partiami np. po 30, 50 czy 100 maili - mniej to dobija serwer.

Maila wysyłam tak jak poniżej. Czyli wyświetlam wszystkie maile z bazy i do funkcji mail()

$temat1 = "$_POST[temat]";

$message = "$_POST[tresc]\r\n";

$header = 'MIME-Version: 1.0' . "\r\n";

$header .= 'Content-type: text/html; charset=utf-8' . "\r\n"; 

$header .= 'From: xxx.pl '."\r\n"; 


                        $result = mysql_query("SELECT * FROM `users`");

			while($r = mysql_fetch_array($result)) {

			mail($r['email'],$temat1,$message,$header)

				or die('Nie udało się wysłać wiadomości');

                        }

Jak wysłać te maile partiami?

Proszę o pomoc

Najlepiej do zapytania SQL dodać jakiś LIMIT (oczywiście zapętlony), zostanie wybrana tylko jakaś liczba rekordów np 0,99 potem od 100, 199 itd.

Poza tym:

$result = mysql_query("SELECT * FROM `users`");

Nie wiem, może w tabeli users, masz tylko e-maile. Jednak jeżeli nie, to po co wybierać całą zawartość tabeli zamiast jednej kolumny ‘email’, której używasz w pętli while?

O to Ci chodziło? Ale jak to zapętlić (zaczynam dopiero z php), że jak się wyśle 99maili to żeby później wysłało od 100 - 199 itd. Chciałbym zeby się to automatycznie działo, bo maili bedzie przybywać.

$temat1 = "$_POST[temat]";

$message = "$_POST[tresc]\r\n";

$header = 'MIME-Version: 1.0' . "\r\n";

$header .= 'Content-type: text/html; charset=utf-8' . "\r\n"; 

$header .= 'From: xxx.pl '."\r\n"; 


                        $result = mysql_query("SELECT email FROM `users` LIMIT 99");

         while($r = mysql_fetch_array($result)) {

         mail($r['email'],$temat1,$message,$header)

            or die('Nie udało się wysłać wiadomości');

                        }

Dokładnie, problemem jest to co napisali już koledzy powyżej - próbujesz wysłać wszystkie wiadomości za jednym razem.

Rozwiązaniem jest porcjowanie.

Możesz to rozwiązać tak:

tworzysz sobie dwie nowe tabele np.: wiadomosc i kolejka

w tabeli wiadomość kolumny: msg_id (autoincrement), tytul, tresc

w tabeli kolejka: adresat, msg_id

teraz do tabeli wiadomosc dopisujesz sobie kolejno treści maili jakie będziesz wysyłał, zaś do tabeli kolejka dopisujesz rekordy konkretnych wiadomości do wysyłki (adres email i id treści )

Rozwiązanie w tym stylu pozwoli ci realizować wysyłkę wielu różnych treści jednocześnie.

masz już zakolejkowane wiadomości do wysłania, pozostaje sama wysyłka.

Najlepiej jako crona, odpalany np co 5 minut sprawdza czy w kolejce są jakieś wiadomości do wysłania - jeśli nie, kończy działanie. Jeśli są - pobiera X wiadomości dajmy 50, wysyła maile, po wysłaniu kasuje z kolejki wykonane zadania i kończy pracę.

I tak w kółeczko.

Możesz sobie dostosować ten schemat do własnych potrzeb. Mozesz wykorzystać tylko tabelę kolejki, możesz w niej zamiast pełnego maila skorzystać z relacji i podać tylko id użytkownika itd.

No i na co zwrócił uwagę kostek135, w zapytaniach sql ograniczaj się do niezbędnych kolumn. Jeżeli chcesz pobrać tylko rekordy z kolumny mail, to daj SELECT mail FROM , wybieranie w takich przypadkach wszystkich kolumn * , to czyste marnotrawstwo czasu i pamięci. To najlepszy sposób by dobić bazę.

Coś tutaj jest nie tak…;/ Coś z php jestem cienki;/ Trzeba bedzie sie poduczyć.

$result = mysql_query("SELECT count(email) as num_emailsl FROM users");

$r = mysql_fetch_array($result);


for($od=0; $do>=$r; $od+=99) 

{ 



$result = mysql_query("SELECT email FROM users LIMIT $od, $do");

while($r = mysql_fetch_array($result)) {

			mail($r['email'],$temat1,$message,$header)

				or die('Nie udało się wysłać wiadomości');

			} 

}