Video Kurs Pl - Logo
GEM, 32-700, Bochnia
ul. Proszowska 92
tel./kom.: 606 192 567
e-mail: videokurspl@gmail.com

Jak napisać skrypt masowego mailingu w PHP?

Do wysłania jakiegokolwiek e-maila, potrzebna jest najczęściej znajomość funkcji mail(). Funkcja mail() jest jednak mało wydajna przy wysyłaniu wielu maili na raz, ponieważ dla każdej wiadomości z osobna otwiera i zamyka protokół SMTP (Simple Mail Transfer Protocol).

Czym jest protokół?

Najlepiej pojęcie protokołu będzie wyjaśnić przez przykład. Wyobraźmy sobie policjanta, który spisuje pewnego rodzaju protokół. Protokół ten musi zostać spisany według pewnego rodzaju zasad. Zasady te zależą od tego jaki protokół ma być spisany, jednak zawsze musi on być zgodny z regułami, po to, aby łatwo było go później odczytać. Gdyby nie protokół jedno zdarzenie mogłoby być zapisane na setki różnych sposobów. Spowodowałoby to opóźnienia w odczycie tak zapisanych danych przez inne osoby niż policjant, które je zapisał lub też uniemożliwiłoby to całkowicie odczyt takich danych.

Tak samo jest z protokołem w sensie informatycznym. Na przykład protokół komunikacyjny jest to zbiór ścisłych reguł, które mają zostać wykonane przez urządzenia, które komunikują się ze sobą np. serwery komputerowe. Gdyby nie było ustalonych z góry zasad, to takie połączenia byłyby na pewno dłuższe lub też najczęściej niemożliwe do wykonania. Protokołem komunikacyjnym jest m. in. nasz omawiany protokół SMTP, który opisuje reguły przekazywania poczty elektronicznej (maili) w internecie.

Dodatkowo funkcja mail() nie ma możliwości autentykacji (podania loginu i hasła) dla zewnętrznego serwera obsługującego protokół SMTP, a w końcu chcemy, aby nasz skrypt zawsze działał prawidłowo. Z tego powodu skorzystamy z gotowej klasy PHPMailer. Oczywiście można by napisać własną wersję funkcji mail(), lecz jest to czasochłonne i nie jest to tematem tego artykułu.

Czym jest PHPMailer?

PHPMailer jest to biblioteka, czyli zbiór gotowych funkcji do wykorzystania dotyczących wysyłania e-maili napisana przez Worx International Inc.

Instalacja PHPMailera

PHPMailera możemy ściągnąć tutaj. Przy aktualnym designie strony, po lewej stronie witryny znajduje się menu zatytułowane download. Stamtąd wybieramy odpowiednią dla naszego serwera wersję PHPMailera. Jeżeli na Twoim serwerze korzystasz z PHP 4 to skorzystaj z opcji PHPMailer for PHP 4, jeżeli jednak korzystasz z wyższych wersji PHP 5 + to skorzystaj z opcji PHPMailer for PHP 5/6. Jeżeli nie wiesz jaką wersję PHP posiada Twój serwer to wykonaj w dowolnym pliku php następujący skrypt:

					<?php
						echo phpinfo();
					?>
					

U samej góry strony powinna widnieć wersja Twojego PHP. Ja posiadam PHP w wersji 5.2.6 wybieram więc PHPMailer for PHP 5/6, a następnie rozwijam katalog z aktualnie najnowszą wersją PHPMailer v5.1 i wybieram linka z rozszerzeniem .zip. Po ściągnięciu rozpakowujemy zawartość do katalogu naszej witryny (public_html) lub katalogu użytkownika postawionego przez nas serwera. W moim przypadku jest to Vertrigo Server.

Zawartość naszej rozpakowanej paczki znajduje się teraz prawdopodobnie w folderze o nazwie PHPMailer_v5.1, zmieńmy jego nazwę na phpmailer.

Stwórzmy teraz nowy plik index.php w folderze o jeden poziom niżej niż folder phpmailer. Nie zapomnijmy o ustawieniu strony kodowania pliku na UTF-8, w końcu chcemy aby wszystkie polskie znaczki wyświetlały się poprawnie. Umieścimy także stronę kodowania w metatagach index.php :

					<?php
						echo phpinfo();
					?>
					

Następnie bibliotekę PHPMailer dołączamy do naszego index.php (linia 5) oraz tworzymy nowy obiekt PHPMailera i przypisujemy go do wskaźnika $mail (linia 7).

					<?php
						echo phpinfo();
					?>
					

Od teraz mamy do dyspozycji wszystkie funkcje klasy PHPMailer, której dokumentacja znajduje się tutaj.

PHPMailer w akcji

Załóżmy, że chcemy wysyłać nasze emaile poprzez google mail. Oczywiście, jeżeli masz pocztę gdzie indziej to wszystko powinno działać podobnie, aczkolwiek możliwe, że Twoja poczta będzie się różnić np. portem i wtedy będziesz musiał dostosować ustawienia pod swoją pocztę. Wybieram google mail, ponieważ jest najczęściej używany.

Stwórzmy teraz podstawowy skrypt wysyłający testowego maila.

					<?php
						echo phpinfo();
					?>
					

  • (Linia 9) - podajemy ścieżkę do folderu, w którym znajduje się PHPMailer.
  • (Linia 10) - zaznaczamy, że będziemy korzystać z zewnętrznego serwera obsługującego protokół SMTP.
  • (Linia 11) - podajemy adres serwera smtp naszej poczty, najczęściej jest to smtp.domenapoczty, gdzie domenapoczty to np. wp.pl, poczta.onet.pl etc. Dla google mail według ich specyfikacji musimy jeszcze dodać, że korzystamy z protokołu TLS (Transport Layer Security), który włącza funkcję STARTTLS (która jak sama nazwa wskazuje włącza połączenie TLS). Zapewnia nam to szyfrowanie przesyłanych danych oraz autentykację, czyli upewnienie się, że dane te wysyłane są na pewno przez odpowiednią osobę. TLS jest rozwinięciem protokołu SSL (Secure Socket Layer) i często zamiast TLS pisze się SSL, bo jest to w pewnym sensie wysoka wersja SSL. Z tego powodu przed smtp.gmail.com dopisujemy "ssl://".
  • (Linia 12) - podajemy numer portu (złącza), przez który mają zostać przesłane dane. Jest to najczęściej port 465 lub 587.
  • (Linia 14) - do naszego przyszłego programu od razu ustawiamy flagę SMTPKeepAlive (z ang. utrzymuj otwarte połączenie SMTP) na true, która sprawi, że w odróżnieniu od tego jak wspominałem na początku do funkcji mail() nasz protokół SMTP będzie otwarty dopóki nie zakończy się wykonywanie naszego skryptu lub nie zamkniemy połączenia funkcją SmtpClose.
  • (Linia 15) - ustawiamy flagę SMTPAuth (autentykacja SMTP) na true, co umożliwi nam wysłanie prośby o możliwość autentykacji naszych wkrótce dostarczanych danych do logowania na wybrany przez nas serwer z którym próbujemy nawiązać połączenie (w naszym wypadku gmail.com) .
  • (Linia 16) - podajemy pełną nazwę użytkownika np. login@gmail.com.
  • (Linia 17) - podajemy hasło do naszego konta
  • (Linia 19) - ustawiamy język na polski. Do dyspozycji jest wiele innych języków znajdują się one w folderze language.
  • (Linia 20) - ustawiamy kodowanie wysyłanych znaków zgodnie z kodowaniem naszej strony (UTF-8).
  • (Linia 21) - ustawiamy ContentType, czyli typ zawartości naszej wiadomość np. text/plain, text/html. Ustawiamy ContentType na text/html co pozwoli nam używać tagów z HTML.
  • (Linia 23) - podajemy nasz e-mail
  • (Linia 24) - podajemy jaka nazwa ma być wyświetlona przed naszym e-mailem np. <Arek> mojnick@gmail.com.
  • (Linia 25) - tytuł naszej wiadomości.
  • (Linia 26) - ciało, czyli treść naszej wiadomości.
  • (Linia 28) - funkcja dodająca adresy dokąd mają zostać wysłane wiadomości, jednak unikamy wywoływania tej funkcji wiele razy z innymi adresami, ponieważ każdy nasz odbiorca, będzie widział gdzie zostały wysłane pozostałe e-maile.
  • (Od Lini 30 do 33) - sprawdzamy czy e-mail został wysłany prawidłowo, jeżeli tak to potwierdzamy wysłanie, jeżeli nie to wyświetlamy błąd.
  • (Linia 35) - zamykamy połączenie.

Po podmianie Lini 16, 17, 23, 24, 28 sensownymi własnymi danymi, odpal skrypt i sprawdź czy wszystko działa. Na podany e-mail w lini 28, powinieneś dostać e-mail o treści podanej w lini 26. Pamiętaj, że może to chwilę potrwać. Jeżeli coś Ci nie działa to znaczy, że wykonałeś coś niepoprawnie, skrypt powinien powiedzieć Ci co takiego zrobiłeś źle.

Tworzenie bazy danych

Potrafimy już wysyłać pojedyncze wiadomości, także teraz zajmiemy się wysyłaniem wiadomości do wielu adresatów na raz pobieranych z bazy danych. Zacznijmy od stworzenia tabeli przechowujących adresy e-mail:

					<?php
						echo phpinfo();
					?>
					

Wrzućmy kilka przykładowych rekordów do bazy danych:

					<?php
						echo phpinfo();
					?>
					

Oba te kody możemy wywołać w phpmyadmin, przy pomocy modułu "okienko zapytania" (query window). Pole ID jest identyfikatorem, czyli kluczem poszczególnych rekordów. Pole Email będzie przechowywało e-maile. Dodajmy do bazy danych e-maile, na których łatwo będzie nam testować nasz skrypt, czyli najlepiej nasze własne, nie wkurzajmy innych ludzi ;)

Połączenie z bazą danych

Stwórzmy nowy plik database_connect.php i umieśćmy w nim:

					<?php
						echo phpinfo();
					?>
					

  • (Linia 2) - łączymy się z bazą danych, za localhost podajemy nazwę naszej domeny, za root nazwę naszego użytkownika, a za vertrigo hasło.
  • (Linia 3) - wybieramy bazę danych w której stworzyliśmy tabelkę
  • (Linia 4) - ustawiamy kodowanie pobranych danych na UTF-8.

Wysyłanie wielu maili na raz

Powracamy do naszego poprzedniego kodu, dodając w lini 6 plik database_connect.php oraz zmieniamy sposób wysyłania maili.

					<?php
						echo phpinfo();
					?>
					

  • (Linia 29) pobieramy wszystkie emaile z tabeli newsletter_emails.
  • (Linia 31) pętla while wykonuje się dopóki prawdziwy jest warunek. Warunek jest prawdziwy dopóki jest różny od zera lub null. Funkcja mysql_fetch_assoc zwraca nam w postaci tablicy asocjacyjnej pobrany rekord i przesuwa się o jedno miejsce do przodu, aby przy następnym jej wywołaniu został pobrany inny w następnej kolejności rekord. Jeżeli w zmiennej $wynik znajduje się jakikolwiek rekord z naszej tabeli, to do zmiennej $rekord zostanie przypisana jakaś tablica asocjacyjna. Skoro jest "jakaś" to znaczy, że jest różna od zera lub null i pętla wykona instrukcje znajdujące się w jej ciele. Po przejściu przez ciało pętli funkcja mysql_fetch_assoc jest wywoływana ponownie. Za każdym razem przesuwa swoje wskazywanie (wskaźnik) o jedno miejsce dalej przez co w pewnym momencie wskaźnik będzie wskazywał na "nic", czyli null. Gdy funkcja zwróci null pętla przestanie się wykonywać. Reasumując taki zapis będzie się wykonywać dopóki są jakieś rekordy z pobranej tabeli w zmiennej $wynik.
  • (Linia 33) tablica asocjacyjna jak sama nazwa wskazuje jest tablicą przyporządkowującą (z ang. association) klucz (identyfikator) z wartością. Czyli działa identycznie jak matematyczna jednowartościowa funkcja. Z tego powodu możemy odwoływać się teraz przy pomocy $rekord['Email'] (klucz) do wartości, która się tam znajduje. Wywołując $mail->AddAddress($rekord['Email']); dodajemy adres, na który ma zostać wysłana wiadomość.
  • (Linia 35 do 38) sprawdzamy, czy mail został wysłany, jeżeli tak to informujemy o tym, jeżeli nie to podajemy co poszło nie tak.
  • (Linia 40) bardzo ważna funkcja, która "czyści" dodane adresy, czyli dokładniej ten, który przed chwilą został dodany w lini 33. Jeżeli nie użyjemy tej funkcji, to każdy następny adresat otrzyma niektóre adresy innych osób z naszej bazy.

Problemy przy dużych ilościach maili

Teoretyczne to by było już tyle, ale na wykonanie jakiegokolwiek skryptu w domyślnych opcjach mamy 30 sekund. Zmieńmy to na np. 5 minut, bo niekiedy mając więcej maili do wysłania możemy nie zdążyć wysłać wszystkich.

					<?php
						echo phpinfo();
					?>
					

Do przetestowania czy zmiana zaszła korzystamy z:

					<?php
						echo phpinfo();
					?>
					

Funkcja set_time_limit nie tylko ustawia czas na wykonanie skryptu, ale go także resetuje, tzn. możemy umieścić np. w pętli set_time_limit(30), co spowoduje, że na każde jednorazowe przejście pętli, czyli wysłanie jednego maila będziemy mieli 30 sekund.

Następnym problemem może być to, że nasz serwer nie pozwala SPAMOWAĆ i powiedzmy ustalił, że na 60 sekund, może zostać wysłanych maksymalnie 60 wiadomości e-mail. Twój dostarczyciel poczty mógł np. pozwolić na wysłanie jedynie 10 maili na minutę, także może to wyglądać u Ciebie inaczej. Rozwiążmy ten problemy przy pomocy funkcji sleep, która zatrzymuje wykonywanie skryptu na określoną liczbę sekund. My będziemy oczekiwać 1 sekundę po każdej wiadomości.

					<?php
						echo phpinfo();
					?>
					

Ostateczny kod

Nasz ostateczny kod z uwzględnieniem wszystkiego wygląda następująco:

					<?php
						echo phpinfo();
					?>
					

W taki oto sposób napisaliśmy skrypt masowego mailingu. Nie zapomnijmy o zmianie odpowiednich danych, stworzeniu tabelki oraz połączeniu się z naszą bazą danych.

Aktualnie nie ma żadnych komentarzy
Dodaj własny komentarz:
Treść komentarza:
Nick:















NewsletterRSS - Video Kursy
Zapisz się do Newslettera i bądź na bieżąco z nowościami :-)
Twój e-mail:
*Szanujemy Ciebie i tak samo nie lubimy spamu jak Ty, będziemy informowali Cię tylko o samych nowościach związanych z Video Kursami. W każdym momencie, możesz wypisać się z Newsletera wysyłając do nas e-mail'a. Dla formalności przyciskając button "Zapisuje się*" akceptujesz nasze zasady prywatności.