mailing na listy mailingowe każdy widzi tylko siebie w odbiorcach

Kategoria: Javascript, HTML i CSS



griwes
13 sierpień 2009 - 20:21
Konwencja
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 />"; } } } ?>
RadekD
14 sierpień 2009 - 14:26
Ciekawe, ale proponuję zamiast
$this->status[$elem] = "Udane";


$this->status[$elem] = "Nieudane";


dać po prostu OK, ERROR i usunąć
$this->status[$elem] .= " wysyłanie wiadomości na adres $elem.";


to da IMHO większe możliwości, np.: obsługi języków :)

Pozdrawiam :)
griwes
14 sierpień 2009 - 17:08
Niby tak, ale w założeniu ma być ładnie wyglądające ;)

Poza tym, można zamienić polskie ciągi na stałe definiowane na początku pliku/w innym pliku i po problemie, wystarczy skonfigurować przed użyciem ;) Takie modyfikacje nie powinny nikomu najmniejszego problemu sprawić :)
chommik
22 sierpień 2009 - 22:51
Do wysyłania maili polecam klasę PHPMailer. Po co się męczyć z klasą, skoro już ktoś zrobić to za nas? ;)
A żeby wysłać wielu adresatom i nie podawać adresów wszystkich zamiast pola To: można użyć Bcc: (w polskim ułumaczeniu UDW:)
griwes
26 sierpień 2009 - 14:22
Może i można, ale używając mailera czy bcc niczego się nie nauczymy, aye?


Podobne tematy:
Podatki na patchu 1.04 i nie tylko
sposób na natręta w pociągu i nie tylko
Uwaga na tani mailing!
Czy warto kupować mailing na Allegro?
uwaga na fałszywy mailing
[komputer] widzi tylko dysk na slave