Użytkownik: Hasło:

Nie masz konta? Zarejestruj się

Zarabianie na stronach www

Na początek

T-www-orzenie

Zarabianie na www

Ocena stron www

Własne forum na www

Różniste

Wysyłanie wiadomości e-mail do wszystkich użytkowników z bazy danych.

Wprowadzenie

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.

Skrypt

<?php
session_start();

... tutaj skrypt autoryzacji (zabezpieczający przed nieuprawnionymi osobami) ...

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;
 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;
  }
  $komunikat = "<p>Ilość użytkowników w bazie: $ile_uz <br />wysłano e-mail do: $odlicznie użytkowników.</p>";
  $_SESSION[wyslane] = 1;
}
?>

<html>
<head>
...mety i te inne...
</head>
<body>
...kod strony...
<?php
if (isset($komunikat)) {
echo"$komunikat";
}
?>
...a w tym kodzie w końcu - formularz:...
<form action="" method="post">
<p>Tytuł wiadomości: <input type="text" name="tyt" /></p>
<p>Treść e-maila: <br />
<textarea name="wiadomosc" cols="60" rows="5"></textarea></p>
<input type="submit" name="przycisk" value="wyślij wiadomość" />
</form>
...ewentualnie dalszy kod strony...
</body>
</html>

Objaśnienie 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.


Komentarze do tego artykułu (10)

rab_ka (2009-01-30) Komentarz 1

Czy te skrypty zadziałają rowniez na stronach flasha?

maras (2009-05-28) Komentarz 2

Lipa bo maile powinno sie wysyłać seriami a Ty tego nie uwzględniłeś

lol (2009-07-27) Komentarz 3

maras pojebalo cie ??

CrackP (2009-10-23) Komentarz 4

Wywala błąd:


Parse error: syntax error, unexpected T_VARIABLE, expecting '(' in scieka_katalogu on line 5

www-4u (2009-11-13) Komentarz 5

@CrackP, dzięki za info.
isset $_POST[przycisk] powinno być w nawiasie, czyli isset($_POST[przycisk]).
Już poprawiłem.

mmmm (2009-12-09) Komentarz 6

a jak zrobić, aby była możliwość dodawania załącznika i wysłania go do wszystkich??

Ebay (2010-01-21) Komentarz 7

Fajna stronka :)
Ciekawe rzeczy :)
Pozdrawiam wszystkich normalnych.

dice (2010-06-16) Komentarz 8

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ś...

podsiadadam@gmail.com (2012-03-10) Komentarz 9

Można porcjować ogranicz zapytanie sql i gotowe

Sigal (2012-04-05) Komentarz 10

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ł.

Linki sponsorowane

Skomentuj ten artykuł (zadaj pytanie).

Twój Nick:

Numer komentarza na który odpowiadasz
Jeżeli nie odpowiadasz na konkretny komentarz pozostaw to pole puste.

Twój Komentarz: (Proszę, nie wstawiaj linków ani kodu HTML)

© copyright: www-4u.pl

powrót na górę strony