Często wynika potrzeba wysłania wiadomości do wszystkich użytkowników serwisu (np. newsletter, ważna wiadomość itp.).
Poniżej prezentuję skrypt, który wykona to poważne zadanie. Utworzymy stronę na której będzie formularz, do którego wpiszemy treść wiadomości i przycisk Wyślij. Resztę czarnej roboty odwali wcześniej rzeczony skrypt.
Nie będę w nim opisywał sposobu łączenia z bazą mysql - każdy ma swój wypróbowany. Ważne aby dostep do strony ze skryptem miał tylko administrator, czyli Ty. Można to osiągnąć na wiele sposobów. Można zachasłować folder w którym znajduje się plik tej strony, można zrobić skrypt uwierzytelniający, czy też dopuścić tylko konkretny adres IP, a resztę IPów przekierować na inny adres poprzez funkcję header.
Przejdźmy zatem do samego skryptu.
if (isset($_POST[przycisk]) && $_SESSION[wyslane] != 1) {
... skrypt połączenia z bazą danych ...
$zapytanie = mysql_query("SELECT imie, email FROM uzytkownicy");
$ile_uz = mysql_num_rows($zapytanie);
$odlicznie = 0;
W powyższym fragmencie:
1. w pierwszej linijce jest ustanowiony warunek: "Jeżeli zostanie wciśnięty przycisk "Wyślij wiadomość" i maile nie są jeszcze wysłane" - ta druga część to taki bezpiecznik przed odświeżeniem strony (maile zostały by wysłane drugi raz po odświeżeniu).
2. bez komentarza
3. Wybranie z bazy imion i adresów e-mail wszystkich użytkowników w bazie.
4. Liczenie wszystkich rekordów odpowiadających zapytaniu do bazy, czyli wszystkich użytkowników
5. Ustawiamy dla zmiennej $odlicznie wartość początkową równą zero (o niej jeszcze później).
while($dane = mysql_fetch_array($zapytanie, MYSQL_ASSOC)) {
$naglowek = "From: <twoj_email@poczta.pl>\n";
$naglowek .= "MIME-Version: 1.0\n";
$naglowek .= "Content-type: text/html; charset=utf-8\n";
$tresc = "<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
<title>$_POST[tyt]</title>
</head>
<body>
<p>Witaj $dane[imie].</p>
$_POST[wiadomosc]
</body>
</html> ";
mail($dane[email], $_POST[tyt], $tresc, $naglowek);
$odlicznie = $odlicznie + 1;
}
1. Dla każdego wiersza tabeli bazy (dla każdego użytkownika) wykonaj to co w klamrach
2 - 4 Standardowe nagłówki przy wysyłaniu e-maila w php. Ważne aby kodowanie (4) było takie samo jak strony z formularzem (w tym przykładzie utf-8).
5 - 14 Standardowa budowa e-maila w formacie HTML. W tym przypadku wykorzystałem imię użytkownika do powitania - $dane[imie] (imię z bazy danych).
15. skrypt wysyłający e-mail, gdzie w nawiasie podaje się w kolejności: e-mail użytkownika, tytuł wiadomości, treść, nagłówek (nagłówki).
16. Do każdego rekordu dla zmiennej $odlicznie dodajemy jeden, aby w późniejszym komunikacie zobaczyć do ilu osób wysłaliśmy e-mail.
17. Zamykamy klamrę czyli kończymy "automat" dla każdego rekordu.
$komunikat = "<p>Ilość użytkowników w bazie: $ile_uz <br />wysłano e-mail do: $odlicznie użytkowników.</p>";
$_SESSION[wyslane] = 1;
}
1. Ustanawiamy komunikat informujący o liczbie użytkowników w bazie, i liczbie użytkowników do których poszła wiadomość. Powinna być identyczna :)
2. Ustawiamy zmienną sesji zabezpieczającą przed ponownym wysłaniem wiadomości po odświeżeniu strony.
3. Klamra zamykająca dla pierwszego warunku (linijka 1 w pierwszym fragmencie).
Koniec skryptu.
W dalszej części kodu strony jest jeszcze fragment wyświetlający komunikat.
Wywala błąd:
Parse error: syntax error, unexpected T_VARIABLE, expecting '(' in scieka_katalogu on line 5
@CrackP, dzięki za info.
isset $_POST[przycisk] powinno być w nawiasie, czyli isset($_POST[przycisk]).
Już poprawiłem.
a jak zrobić, aby była możliwość dodawania załącznika i wysłania go do wszystkich??
pfff.... a co jeśli w bazie mamy 20 000 użytkowników, a skrypt się zawiesi przy takiej ilości ? Słaba opcja. Lepiej to porcjować jakoś...
Odpowiedź na komentarz nr 8:
Pytanie odnośnie pogrupowania jak to zrobić bo zmieniam ten systemik troszkę pod kontem automatu z crona aktywowanego tylko nie wiem jak to pogrupować aby serwer sie nie zawierzał.
© copyright: www-4u.pl