Wysyłka maili w WordPress
WordPress wysyła wiadomości e-mail przy wielu okazjach: powiadomienie o nowym komentarzu, link do resetu hasła, potwierdzenie zamówienia w WooCommerce, powiadomienie o nowym użytkowniku. Domyślnie robi to przez funkcję PHP mail(), która na współdzielonym hostingu często kończy się tym, że wiadomość trafia do spamu albo nie dociera w ogóle.
Czas wdrożenia: 15–30 minut (metoda wtyczkowa), ok. 10 minut (metoda ręczna).
Dlaczego mail() zawodzi
Funkcja mail() przekazuje wiadomość bezpośrednio do lokalnego serwera pocztowego na maszynie hostingowej. Serwer wysyła ją dalej — bez uwierzytelnienia, w imieniu domeny, której właściwie nie „obsługuje". Z perspektywy serwerów pocztowych odbiorcy wygląda to podejrzanie.
Konkretne problemy:
- Reputacja IP — serwer współdzielony wysyła pocztę od dziesiątek klientów. Jeden klient spamuje, cierpi cała pula adresów IP. Twoje wiadomości mogą być odrzucane za grzechy sąsiadów.
- Niezgodność SPF — rekord SPF twojej domeny wskazuje zazwyczaj na dedykowany serwer pocztowy, nie na serwer www. Wiadomość wysłana przez
mail()pochodzi z innego IP, więc SPF nie przechodzi. - Brak DKIM —
mail()nie podpisuje wiadomości kluczem DKIM. Nowoczesne filtry antyspamowe (Gmail, Outlook) traktują to jako sygnał ostrzegawczy. - Brak uwierzytelnienia —
mail()nie loguje się nigdzie. Serwery odbiorcze nie mają pewności, kto faktycznie wysyła wiadomość.
Efekt praktyczny: link do resetu hasła ląduje w spamie, potwierdzenie zamówienia nie dochodzi do klienta, powiadomienia administracyjne znikają bez śladu.
SMTP jako właściwe rozwiązanie
SMTP, czyli Simple Mail Transfer Protocol, to protokół wysyłania poczty z uwierzytelnieniem. WordPress łączy się z serwerem pocztowym, loguje się danymi konta e-mail i zleca wysyłkę. Serwer pocztowy wysyła wiadomość w normalny sposób — z właściwym IP, z podpisem DKIM, z rekordem SPF, który się zgadza.
mail() | SMTP | |
|---|---|---|
| Uwierzytelnienie | brak | login + hasło |
| SPF | zazwyczaj nie przechodzi | przechodzi |
| DKIM | brak | podpisywane przez serwer pocztowy |
| Reputacja IP | wspólna pula serwera www | IP dedykowanego serwera pocztowego |
| Wiadomości w spamie | częste | rzadkie |
💡 Jakie konto SMTP wybrać?
Dla stron z małym ruchem pocztowym (kilka–kilkanaście maili dziennie) wystarczy konto e-mail na własnej domenie w hostingu Joton. Dla WooCommerce i sklepów wysyłających dziesiątki maili dziennie warto rozważyć zewnętrzny serwis transakcyjny (Brevo, Mailgun, Postmark) — mają dedykowane IP i lepsze narzędzia do monitorowania dostarczalności.
Metoda 1: Wtyczka WP Mail SMTP (dla początkujących)
To najszybsza metoda — nie wymaga pisania kodu. WP Mail SMTP to jedna z najpopularniejszych wtyczek do tego zadania (ponad 3 miliony instalacji), aktywnie rozwijana.
Instalacja
- Zaloguj się do panelu administracyjnego WordPress (
/wp-admin) - Przejdź do Wtyczki → Dodaj nową
- W polu wyszukiwania wpisz
WP Mail SMTP - Kliknij Zainstaluj teraz obok wtyczki autorstwa WPForms
- Po instalacji kliknij Aktywuj
Konfiguracja — konto e-mail na hostingu Joton
To najprostsze ustawienie: używasz adresu e-mail skonfigurowanego w panelu Joton jako nadawcy.
- Przejdź do WP Mail SMTP → Ustawienia
- W sekcji Od (e-mail) wpisz adres nadawcy (np.
[email protected]) - W sekcji Od (nazwa) wpisz nazwę wyświetlaną (np.
Twoja Firma) - Zaznacz opcję Wymuś e-mail od i Wymuś nazwę od — WordPress nie nadpisze tych wartości
- W sekcji Mailer wybierz Inne SMTP
- Uzupełnij dane serwera pocztowego:
| Pole | Wartość |
|---|---|
| Host SMTP | mail.twojadomena.pl |
| Szyfrowanie | TLS |
| Port | 587 |
| Uwierzytelnienie | włączone |
| Nazwa użytkownika | pełny adres e-mail, np. [email protected] |
| Hasło | hasło do skrzynki pocztowej |
💡 Gdzie znaleźć dane SMTP w panelu Joton?
Przejdź do Skrzynki e-mail w panelu Joton i kliknij nazwę skrzynki. Dane serwera SMTP (host, port) są widoczne w ustawieniach konta. Adres hosta to zazwyczaj mail.TWOJADOMENA.PL.
- Kliknij Zapisz ustawienia
Konfiguracja — Gmail z hasłem aplikacji
Gmail wymaga hasła aplikacji — zwykłe hasło do konta Google nie zadziała (Google blokuje logowanie z aplikacji zewnętrznych).
- Zaloguj się do konta Google → Zarządzaj kontem Google → Bezpieczeństwo
- Włącz Weryfikację dwuetapową (wymagana do haseł aplikacji)
- W sekcji bezpieczeństwa kliknij Hasła aplikacji
- Wybierz aplikację: Inna (nazwa własna), wpisz np.
WordPress - Skopiuj wygenerowane 16-znakowe hasło
W WP Mail SMTP:
- Host SMTP:
smtp.gmail.com - Szyfrowanie:
TLS - Port:
587 - Nazwa użytkownika: twój adres Gmail
- Hasło: skopiowane hasło aplikacji (16 znaków, bez spacji)
⚠️ Limit wysyłki Gmail
Gmail przez SMTP pozwala wysłać maksymalnie 500 wiadomości dziennie. Jeżeli prowadzisz sklep WooCommerce lub listy mailingowe, to za mało — użyj konta pocztowego na hostingu lub serwisu transakcyjnego.
Test wysyłki
- Przejdź do WP Mail SMTP → Narzędzia → Test e-mail
- Wpisz swój adres e-mail jako odbiorcę
- Kliknij Wyślij e-mail
- Sprawdź skrzynkę — wiadomość powinna dojść w ciągu kilku sekund
Jeżeli test się nie powiedzie, wtyczka wyświetli szczegółowy komunikat błędu — najczęściej błędne hasło lub zablokowany port.
Metoda 2: Konfiguracja ręczna przez functions.php (dla zaawansowanych)
Ta metoda nie wymaga wtyczki. WordPress używa biblioteki PHPMailer do wysyłki e-mail i udostępnia hak phpmailer_init, który pozwala podmienić konfigurację przed każdą wysyłką.
⚠️ Zmiany w functions.php
Kod dodawany do functions.php motywu zostanie utracony przy aktualizacji motywu nadrzędnego. Używaj motywu potomnego (child theme) albo utwórz własną wtyczkę mu-plugins — patrz wskazówka poniżej.
Konfiguracja przez functions.php
Otwórz plik functions.php swojego motywu (lub motywu potomnego) i dodaj na końcu:
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = 'mail.twojadomena.pl';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587;
$phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$phpmailer->Username = '[email protected]';
$phpmailer->Password = 'twoje_haslo_smtp';
$phpmailer->From = '[email protected]';
$phpmailer->FromName = 'Twoja Firma';
});Podmień wartości:
mail.twojadomena.pl— host SMTP twojego serwera pocztowego[email protected]— adres e-mail skrzynki nadawczejtwoje_haslo_smtp— hasło do skrzynki pocztowejTwoja Firma— nazwa wyświetlana jako nadawca
⚠️ Hasło w kodzie źródłowym
Hasło w pliku PHP jest przechowywane w czystym tekście. Jeżeli repozytorium git jest publiczne lub masz wątpliwości co do bezpieczeństwa dostępu do plików, przenieś dane logowania do stałych w wp-config.php zamiast wpisywać je bezpośrednio.
Bezpieczniejsza wersja: dane w wp-config.php
Dodaj stałe w pliku wp-config.php (przed linią /* That's all, stop editing! */):
define('SMTP_HOST', 'mail.twojadomena.pl');
define('SMTP_PORT', 587);
define('SMTP_USER', '[email protected]');
define('SMTP_PASS', 'twoje_haslo_smtp');
define('SMTP_FROM', '[email protected]');
define('SMTP_NAME', 'Twoja Firma');Następnie w functions.php użyj stałych zamiast wartości na sztywno:
add_action('phpmailer_init', function(PHPMailer\PHPMailer\PHPMailer $phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = SMTP_HOST;
$phpmailer->SMTPAuth = true;
$phpmailer->Port = SMTP_PORT;
$phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->From = SMTP_FROM;
$phpmailer->FromName = SMTP_NAME;
});wp-config.php jest poza katalogiem motywu — przy aktualizacjach motywu nie zostanie nadpisany.
💡 Alternatywa: mu-plugins
Jeszcze lepszym miejscem niż functions.php jest katalog wp-content/mu-plugins/. Utwórz plik wp-content/mu-plugins/smtp-config.php z powyższym kodem (pamiętaj o otwierającym <?php). Wtyczki w mu-plugins są ładowane automatycznie i nie wymagają aktywacji przez panel — nie da się ich przypadkowo wyłączyć.
Test bez wtyczki
WordPress nie ma wbudowanego testu wysyłki w panelu administracyjnym. Najprostszy sposób to tymczasowa instalacja lekkiej wtyczki Check Email (lub skorzystaj z WP CLI):
wp eval 'wp_mail("[email protected]", "Test SMTP", "Działa!");'Najczęstsze problemy
Wiadomość testowa nie dochodzi, brak błędu
Sprawdź folder spam u odbiorcy. Jeżeli tam też nie ma — sprawdź czy adres From w konfiguracji SMTP zgadza się z nazwą użytkownika SMTP. Wiele serwerów pocztowych odrzuca wiadomości, gdzie nadawca różni się od zalogowanego konta.
Błąd „SMTP connect() failed"
Przyczyną jest zazwyczaj zablokowany port. Porty 465 i 587 mogą być blokowane przez firewalle hostingowe lub dostawców internetu.
Sprawdź z poziomu SSH czy port jest dostępny:
openssl s_client -connect mail.twojadomena.pl:587 -starttls smtpJeżeli połączenie nie wychodzi, spróbuj portu 465 ze szyfrowaniem SSL zamiast 587 z TLS:
$phpmailer->Port = 465;
$phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS;Błąd uwierzytelnienia Gmail: „Username and Password not accepted"
Gmail od 2022 roku nie akceptuje zwykłego hasła do konta. Potrzebujesz hasła aplikacji (App Password) — patrz krok 3–5 sekcji konfiguracji Gmail powyżej. Weryfikacja dwuetapowa musi być włączona.
Wiadomości wychodzą, ale trafiają do spamu
Upewnij się, że:
- Rekord SPF domeny zawiera serwer pocztowy, z którego wysyłasz
- Skrzynka nadawcza ma skonfigurowany DKIM (w panelu Joton: Skrzynki e-mail → DKIM)
- Adres
Fromw WordPress odpowiada domenie, z której wysyłasz
Domyślnie WordPress ustawia nadawcę jako [email protected]. Jeżeli taka skrzynka nie istnieje na serwerze pocztowym, wiadomość zostanie odrzucona przez część serwerów. Wtyczka WP Mail SMTP lub hak phpmailer_init pozwalają nadpisać ten adres na istniejącą skrzynkę.
Po aktualizacji motywu SMTP przestało działać
Edytowałeś functions.php motywu nadrzędnego zamiast potomnego. Przenieś kod do motywu potomnego (/wp-content/themes/TWOJ-MOTYW-CHILD/functions.php) albo do pliku mu-plugins — patrz wskazówka w sekcji konfiguracji ręcznej.
Przydatne linki
- Skrzynki e-mail — tworzenie kont pocztowych i dane SMTP w panelu Joton
- Narzędzia programistyczne — dostęp SSH, WP-CLI
- Hardening wp-config.php — bezpieczne przechowywanie danych konfiguracyjnych