Griwes' Homepage
May the power of the Code be with you!

Wysyłanie maila, kilka osób

13 Aug 2009, 14:27:24
Skrypt ten i tutorial, ukazujący jak skrypt działa, był wcześniej opublikowany na forum www.webtips.pl.

Zapis "Kod #1.3" oznacza "Fragment kodu z listingu #1, w miejscu oznaczonym jako //3".

1. Wymagania:
- serwer obsługujący PHP5
- znajomość zasad programowania obiektowego w PHP
- znajomość działania funkcji array_walk(), explode() i mail()
- stopień zaawansowania: średni

2. Opis skryptu linijka po linijce
Zaczynamy od zdefiniowania klasy. Cały kod będzie znajdował się w jednym pliku, np mailing.class.php.

Kod #1:class mailing { private $delimiter; //znak rozdzielający adresy private $selfmail; //własny adres email private $topic; //tytuł wysyłanych maili private $receivers; //odbiorcy (tablica private $text; //treść maila private $status; //tablica, używana do przechowywania wyników wywołań mail() function __construct($selfmail, $topic, $receivers, $text, $delimiter) { //1 - treść konstruktora } public function send() { //2 - wysyłanie } private function callback_send($elem, $key) { //3 - treść funkcji wywoływanej przez array_walk() } public function add_receiver($receiver) { //4 - dodawanie odbiorcy } public function remove_receiver($receiver) { //5 - usuwanie odbiorcy } public function show_status() { //6 - wyświetlanie statusu } }

mailing::$delimiter przechowuje znak (lub znaki) służący do oddzielania adresów w ciągu podawanym do konstruktora (patrz kod #1.1)

mailing::$selfmail zawiera adres, który będzie widoczny w polu nadawcy.

mailing::$status jest tablicą, która będzie wykorzystana później.


Kod #1.1: $this->selfmail = $selfmail; $this->topic = $topic; $this->text = $text; $this->delimiter = $delimiter; $this->status = array(); $this->receivers = explode($this->delimiter, $receivers);

Powyższy kod inicjuje wszystkie zmienne klasy. O tym, w jaki sposób działa explode, możesz poczytać na pl.php.net.

Teraz wysyłanie maili, dwa następne kody tego dotyczą. Pierwszy uruchamia array_walk():

Kod #1.2: array_walk(&$this->receivers, array($this, "callback_send");

Funkcja array_walk przyjmuje dwa argumenty:
- pierwszy jest tablicą, i dla wszystkich elementów tej tablicy zostanie wykonana funkcja podana w drugim argumencie
- drugi argument jest tablicą, pełniącą funkcję wywołania. Pierwszy element tej tablicy jest obiektem, którego funkcja ma zostać wykonana (tutaj aktualny obiekt, $this), a drugi jest nazwą funkcji. Funkcja taka musi przyjmować dwa argumenty: pierwszy jest referencją do elementu, a drugi indeksem tablicy.

A teraz sama funkcja callback_send():

Kod #1.3: if (!@mail($elem, $this->title, $this->text, "From: ".$this->selfmail)) { $this->status[$elem] = "Udane"; } else { $this->status[$elem] = "Nieudane"; } $this->status[$elem] .= " wysyłanie wiadomości na adres $elem.";

Wysyłamy maila funkcją mail(). Operator ! oznacza oczywiście negację, a @ powoduje, że funkcja nie wyświetli żadnego ostrzeżenia czy błędu. O argumentach mail() można poczytać na pl.php.net ;)

Teraz funkcja służąca do dodawania odbiorców już po utworzeniu obiektu, następnie odwrotna - usuwanie tychże.

Kod #1.4: $this->receivers[] = $receiver;

Prosty kod, nie wymaga chyba opisywania.

Kod #1.5: foreach ($this->receivers as $key => elem) { if ($elem == $receiver) { unset($this->receivers[$key]); } }

Słowem, przeczesujemy całą tablicę z odbiorcami i usuwamy każde wystąpienie zadanego odbiorcy.

No i jeszcze wyświetlanie statusu, ale to już prostsza pętla.

Kod #1.6: foreach ($this->status as $elem) { echo $elem."<br />"; }

3. Podsumowanie i gotowy kod
Tak więc mamy klasę, która do każdego z zadanych adresatów wysyła maila, no i każdy z nich widzi tylko siebie w polu "odbiorcy". Dzięki funkcji add_receiver() w łatwy sposób można dodawać adresatów np. z bazy danych.

Gotowy kod:

Kod #2:class mailing { private $delimiter; //znak rozdzielający adresy private $selfmail; //własny adres email private $topic; //tytuł wysyłanych maili private $receivers; //odbiorcy (tablica private $text; //treść maila private $status; //tablica, używana do przechowywania wyników wywołań mail() function __construct($selfmail, $topic, $receivers, $text, $delimiter) { $this->selfmail = $selfmail; $this->topic = $topic; $this->text = $text; $this->delimiter = $delimiter; $this->status = array(); $this->receivers = explode($this->delimiter, $receivers); } public function send() { array_walk(&$this->receivers, array($this, "callback_send"); } private function callback_send($elem, $key) { if (!@mail($elem, $this->title, $this->text, "From: ".$this->selfmail)) { $this->status[$elem] = "Udane"; } else { $this->status[$elem] = "Nieudane"; } $this->status[$elem] .= " wysyłanie wiadomości na adres $elem."; } public function add_receiver($receiver) { $this->receivers[] = $receiver; } public function remove_receiver($receiver) { foreach ($this->receivers as $key => elem) { if ($elem == $receiver) { unset($this->receivers[$key]); } } } public function show_status() { foreach ($this->status as $elem) { echo $elem."<br />"; } } }

Skomentowano 0 razy.


Dodaj komentarz


Nick*:


Strona internetowa:


Treść komentarza* (co najmniej 10 znaków):




Wróć na stronę główną...