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.