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.

$message – 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

Cały kompletny przykład powinien wyglądać mniej – więcej tak:

<?php
   $header = "From: twoj@email.com \nContent-Type:".
             ' text/plain;charset="UTF-8"'.
             "\nContent-Transfer-Encoding: 8bit";
   $to = "odbiorca@email.com";
   $subject = "Wiadomość testowa";
   $message = "Witaj to wiadomość testowa";
   mail($to, $subject, $message, $header)

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. Czytaj jak zintegrować formularz PHP z Google reCAPTCHA w osobnym przewodniku.

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).
  • znacznie szybsze wysyłanie e-maili niż w metodzie z uwierzytelnianiem SMTP

Wady PHP mail

  • przy nadużywaniu serwer może trafić na czarną listę a wiadomości mogą trafiać do spamu,
  • czasami e-maile 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 i wykorzystać uwierzytelnianie SMTP.

Wysyłanie e-maili z autoryzacją SMTP może wyeliminować wszystkie błędy. Czytaj więcej o wysyłaniu e-maili z autoryzacją SMTP w osobnym przewodniku.

Załącznik w wiadomości e-mail w PHP

Nawet za pomocą najprostszej metody wysyłania e-maila w PHP można wysłać załącznik. Wystarczy do ciała wiadomości dodać odpowiedni nagłówek i umieścić pożądany plik. Całość jest dość złożona dlatego zamieszczę cały działający przykład. Nie zapomnij sprawdzić poprawności adresów e-mail:

<?php
$file = "pliki/photo.jpg"; /* ścieżka do pliku */ 
$filename = "photo.jpg"; /* nazwa pliku w wiadomości */

$content = file_get_contents($file);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);

$from_name = "Jan Kowalski";
$from_mail = "adresnadawcy@email.pl";
$replyto = "adresnadawcy@email.pl";
$to = "adresat@mail.pl";
$subject = "E-mail testowy z plikiem";
$message = "Witaj, w załączeniu testowy załącznik";

$header = "From: " . $from_name . " <" . $from_mail . ">\r\n" . 
   "Reply-To: " . $replyto . "\r\n" . 
   "MIME-Version: 1.0\r\n" . 
   "Content-Type: multipart/mixed; boundary=\"" . 
   $uid . "\"\r\n\r\n";

$str_message = "--" . $uid . "\r\n" . 
   "Content-type:text/plain; charset=utf-8\r\n" . 
   "Content-Transfer-Encoding: 7bit\r\n\r\n" . $message . 
   "\r\n\r\n" . "--" . $uid . "\r\n" . 
   "Content-Type: application/octet-stream; name=\"" . 
   $filename . "\"\r\n" . 
   "Content-Transfer-Encoding: base64\r\n" . 
   "Content-Disposition: attachment; filename=\"" . 
   $filename . "\"\r\n\r\n" . $content . "\r\n\r\n" . 
   "--" . $uid . "--";
if (mail($to, $subject, $str_message, $header))
{
echo "Wiadomość z załacznikiem wysłana poprawnie.";
}
else
{
echo "Błąd w wysyłaniu wiadomości.";
}

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

Oceń artykuł na temat: Wysyłanie e-mail ze strony czyli PHP mail
Średnia : 4.6 , Maksymalnie : 5 , Głosów : 28