Web Design Blog / Programowanie:

Wysyłanie e-mail ze strony czyli PHP mail

Data publikacji: 29 października 2019

Jeżeli miałbym podać tylko jeden powód dla którego uczyłem się i ciągle korzystam z PHP to byłaby to jego przeważająca popularność w wytwarzaniu stron i aplikacji webowych. Znając ten język mogę pracować nad większością stron, sklepów i aplikacji internetowych. Biorąc pod uwagę skalę biznesów, które są zainteresowanymi pracą samodzielnego freelancera będzie to blisko 100% przypadków. Przez 6 lat działalności dosłownie jeden raz miałem przypadek, że start-up medycznego portalu był napisany w ASP .NET. Dlatego ciągle korzystam z PHP i nie mam zamiaru tego zmieniać w najbliższych latach.

Jeżeli miałbym podać drugi powód byłaby to jego prostota i specjalizacja pod typowo internetowe przypadki użycia. PHP jest super wąsko wyspecjalizowany dla potrzeb Internetu a to wiąże się z jego kolejną korzyścią. Wiele bardzo przydatnych i użytecznych funkcjonalności w jakie mogą być wyposażone nasze aplikacje można w tym języku wykonać za pomocą jednej linijki kodu. Upload plików na serwer, walidacja e-maila czy zmniejszenie i kadrowanie rozmiaru zdjęcia to operacje, które nie wymagają użycia dodatkowych bibliotek. W tym artykule pokażę jak wysłać pełnoprawną wiadomość e-mail w aplikacji PHP. Dzięki wykorzystaniu tego mechanizmu można:

  • wysyłać powiadomienia dla użytkowników aplikacji,
  • stworzyć mały newsletter,
  • automatyzować korespondencję z klientami,
  • stworzyć formularz kontaktowy, który będzie wysyłał wiadomości od użytkowników strony WWW.

PHP mail – jak wysłać e-mail ze strony?

Jak wspomniałem, wiadomość e-mail w aplikacji PHP można wysłać za pomocą jednej funkcji z kilkoma parametrami.

mail($to, "$subject", $message", $header);

Może ciężko w to uwierzyć jeżeli masz doświadczenie w innych środowiskach webowych, ale w świecie PHP powyższa linijka całkowicie rozwiązuje problem. Bez żadnych bibliotek, frameworków i innych cudactw.

$to to nic innego jak zmienna przechowująca e-mail adresata na który serwer ma wysłać wiadomość.

$subject – jak można się domyślić, to tytuł wysyłanego e-maila.

$wiadomosc – to właściwa treść e-maila, która może być czystym tekstem lub zawartością HTML ze stylem i obrazkami.

$header to nagłówek i poniżej krótkie wytłumaczenie co to takiego.

Przykładowy nagłówek wiadomości e-mail może wyglądać tak:

$header = "From: $email \nContent-Type:".
          ' text/plain;charset="UTF-8"'.
          "\nContent-Transfer-Encoding: 8bit";

Pierwsza linijka nagłówka informuje serwer pocztowy z jakiego e-maila wysłano wiadomość. W najczęstszych przypadkach nie jest to w żaden sposób weryfikowane i można tam wprowadzić dowolny adres e-mail.

Druga linijka nagłówka to deklaracja formatu wiadomości, tutaj mamy text/plain w kodowaniu UTF-8. Jeżeli chcemy posługiwać się znacznikami HTML i stylować treść można tam wprowadzić:

 'text/html;charset="UTF-8"'.

Trzecia linijka deklaruje wartość Content-Transfer-Encoding i tutaj niczego nie zmieniamy. Zainteresowanych zgłębieniem tematu odsyłam do dokumentacji: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

Bezpieczeństwo i praktyczne przykłady wykorzystania PHP mail

Jak można się domyślić, nierzadko dojdzie do sytuacji, w których dane lub część danych podawanych jako argumenty funkcji mail() będą pochodzić od użytkowników. Na sam początek zajmijmy się sanityzacją i walidacją adresu-email.

Filtrowanie e-mail

Sanityzacja to „odkażenie” danych, np. usunięcie nawiasów, spacji i nadmiarowych znaków, które wprowadził użytkownik. Walidacja to sprawdzenie czy adres spełnia wymogi np. czy znajduje się znak @ i czy domena składa się z dwóch członów rozdzielonych kropką. W dużym skrócie: adres e-mail zaleca się sanityzować i walidować aby uniknąć błędów:

$email= filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
/* Dalsza część kodu np. przypisanie do nagłówka */
}

Ten trik można użyć przy innych okolicznościach, np. wprowadzaniu danych do bazy.

Zabezpieczenie antyspamowe formularzy kontaktowych

Jako dodatek napiszę nieco o zabezpieczaniu formularzy. Boty uwielbiają wysyłać przypadkowe formularze wypełniając ją nic nie znaczącą treścią, w której znajduje się link do strony, do której ma być pozyskany sztuczny ruch. Tym bardziej, jeżeli użyte nazwy pól formularzy lub nazwy plików php mają tak kreatywne nazwy jak email, name, message i email.php

W zabezpieczeniu antyspamowym można użyć technikę honeypot, np. stworzyć sztuczne ukryte pole e-mail, które ma zostać nie wypełnione a właściwe pole dla e-maila nazwać np. xxx. Robot na ślepo wypełni niewidoczne dla użytkownika pole a my możemy takie wiadomości odrzucić.

Inną techniką jest stworzenie niewidocznego pola, które po załadowaniu strony dynamicznie wypełniane jest na jakiś kod np. 123. Większość botów nie analizuje kodu JavaScript dlatego można bardzo prostą i kolejną niewidoczną dla użytkownika metodą odsiać sztuczne wiadomości.

Wreszcie można użyć zabezpieczenia obrazkowego – zaimplementować własne proste algorytmy lub w ostateczności wykorzystać gotowe API np. Google reCAPTCHA. Osobiście uważam to za rozwiązanie zbyt uciążliwe dla użytkowników a do wad można zaliczyć fakt, że przy tak prozaicznej i banalnej funkcjonalności musi dochodzić do komunikacji z zewnętrznymi serwerami, które w najmniej odpowiednim momencie mogą chwilowo nie działać lub powodować inne problemy lub utrudnienia np. wymóg SSL, generowanie klucza whatever…

Potwierdzenie wysłania e-maila w PHP

Jeżeli w kodzie nie ma błędów a funkcja mail() działa na serwerze funkcja po wywołaniu zwraca wartość true. Można w ten sposób stworzyć bardzo prosty mechanizm, sprawdzający poprawne wysłanie wiadomości.

if(mail($to, "$subject", $message", $header)){
   echo "Poprawnie wysłano e-mail";
}
else{
   echo "Wystąpił nieoczekiwany błąd, spróbuj jeszcze raz..."
}

Pamiętajmy jednak, że to czy e-mail dochodzi leży w gestii innych serwerów obsługujących mail. dlatego takiego 100 procentowego potwierdzenia otrzymania e-maila (jak przy wykorzystaniu SMTP) nie mamy.

Zalety PHP mail

  • prostota implementacji,
  • brak konieczności posiadania własnego adresu e-mail,
  • wysoka przenośność kodu,
  • funkcja mail() dostępna jest u większości czołowych dostawców hostingu,
  • można stworzyć newsletter z wysyłaniem załączników (wielu dostawców usługi newslettera blokuje możliwość wysłania załącznika).

Wady PHP mail

  • przy nadużywaniu serwer może trafić na czarną listę a wiadomości mogą trafiać do spamu,
  • czasami e-maila mogą nie dochodzić do adresata i nie jesteśmy w stanie sprawdzić tego w stu procentach (czy dotarł),
  • niektórzy dostawcy blokują funkcję mail() z powodów polityki antyspamowej, dlatego czasami trzeba zmienić przyzwyczajenia w zależności od dostawcy.

Podsumowanie

Jak widać wysłanie e-mail wprost z serwera bez oddzielnego konta SMTP to nic trudnego. Wystarczy praktycznie jedna linijka kodu aby wysłać wiadomość niezależnie od jej charakteru czy przeznaczenia. Automatyzacja pracy, mały newsletter, formularz na stronie? Stary i sprawdzony PHP mail może to załatwić.

Źródła

https://www.php.net/manual/en/function.mail.php

https://www.php.net/manual/en/filter.examples.sanitization.php

Wysyłanie e-mail ze strony czyli PHP mail Wysyłanie e-mail ze strony czyli PHP mail 4.6 na 5 na podstawie 7 ocen Wysyłanie e-mail ze strony czyli PHP mail


Komentarze

Brak komentarzy.

Dodaj swój komentarz