Chociaż istnieją części tej odpowiedzi, które dotyczą tylko korzystania z mail()
samej funkcji, wiele z tych kroków rozwiązywania problemów można zastosować do dowolnego systemu pocztowego PHP.
Istnieje wiele powodów, dla których skrypt nie wysyła wiadomości e-mail. Trudno jest zdiagnozować te rzeczy, chyba że wystąpi oczywisty błąd składniowy. Bez tego musisz przejrzeć poniższą listę kontrolną, aby znaleźć potencjalne pułapki, które możesz napotkać.
Upewnij się, że raportowanie błędów jest włączone i ustawione na zgłaszanie wszystkich błędów
Zgłaszanie błędów jest niezbędne do usuwania błędów w kodzie i ogólnych błędów napotykanych przez PHP. Aby otrzymywać te błędy, należy włączyć raportowanie błędów. Umieszczenie następującego kodu na górze plików PHP (lub w głównym pliku konfiguracyjnym) umożliwi raportowanie błędów.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Zobacz Jak mogę uzyskać przydatne komunikaty o błędach w PHP? - ta odpowiedź zawiera więcej szczegółów na ten temat.
Upewnij się, że mail()
funkcja została wywołana
Może się to wydawać głupie, ale częstym błędem jest zapomnienie o umieszczeniu mail()
funkcji w kodzie. Upewnij się, że tam jest i nie jest komentowany.
Upewnij się, że mail()
funkcja została poprawnie wywołana
bool mail (ciąg $ do, ciąg $ temat, ciąg $ wiadomość [, ciąg $ dodatkowe_podstawy [, ciąg $ dodatkowe_parametry]])
Funkcja poczty przyjmuje trzy wymagane parametry i opcjonalnie czwarty i piąty. Jeśli Twoje wezwanie do mail()
nie ma co najmniej trzech parametrów, zakończy się niepowodzeniem.
Jeśli Twoje wezwanie do mail()
nie ma poprawnych parametrów we właściwej kolejności, również się nie powiedzie.
Sprawdź dzienniki poczty serwera
Twój serwer internetowy powinien rejestrować wszystkie próby wysłania za jego pośrednictwem wiadomości e-mail. Lokalizacja tych dzienników będzie się różnić (być może będziesz musiał zapytać administratora serwera, gdzie się znajdują), ale zwykle można je znaleźć w katalogu głównym użytkownika pod logs
. Wewnątrz znajdują się komunikaty o błędach, które serwer zgłosił, jeśli takie istnieją, związane z próbami wysłania wiadomości e-mail.
Sprawdź awarię połączenia z portem
Blok portów jest bardzo częstym problemem, z którym zmaga się większość programistów, integrując swój kod w celu dostarczania wiadomości e-mail za pomocą SMTP. I można to łatwo prześledzić na serwerach maillogs (lokalizacja serwera dziennika poczty może się różnić w zależności od serwera, jak wyjaśniono powyżej). W przypadku korzystania z udostępnionego serwera hostingowego porty 25 i 587 pozostają domyślnie zablokowane. Ten blok został celowo wykonany przez Twojego dostawcę hostingu. Dotyczy to nawet niektórych serwerów dedykowanych. Gdy te porty są zablokowane, spróbuj połączyć się przy użyciu portu 2525. Jeśli okaże się, że ten port jest również zablokowany, jedynym rozwiązaniem jest skontaktowanie się z dostawcą usług hostingowych w celu odblokowania tych portów.
Większość dostawców hostingu blokuje te porty e-mail, aby chronić swoją sieć przed wysyłaniem spamu.
Użyj portów 25 lub 587 dla połączeń zwykłych / TLS i portu 465 dla połączeń SSL. W przypadku większości użytkowników zaleca się użycie portu 587, aby uniknąć limitów prędkości ustalanych przez niektórych dostawców hostingu.
Nie używaj operatora eliminacji błędów
Kiedy operator tłumienia błędów @
jest dołączony do wyrażenia w PHP, wszelkie komunikaty o błędach, które mogą być generowane przez to wyrażenie, zostaną zignorowane. Istnieją okoliczności, w których użycie tego operatora jest konieczne, ale wysyłanie poczty nie jest jednym z nich.
Jeśli Twój kod zawiera @mail(...)
, być może ukrywasz ważne komunikaty o błędach, które pomogą Ci to debugować. Usuń @
i sprawdź, czy zgłoszono jakiekolwiek błędy.
To tylko wskazane, kiedy sprawdzić werror_get_last()
prawo potem do konkretnych awarii.
Sprawdź mail()
wartość zwracaną
mail()
Funkcja:
Zwraca, TRUE
jeśli poczta została pomyślnie przyjęta do dostarczenia, w FALSE
przeciwnym razie. Ważne jest, aby pamiętać, że fakt, iż poczta została zaakceptowana do dostarczenia, NIE oznacza, że faktycznie dotrze do miejsca docelowego.
Należy o tym pamiętać, ponieważ:
- Jeśli otrzymasz
FALSE
wartość zwrotną, wiesz, że błąd polega na tym, że serwer akceptuje pocztę. Prawdopodobnie nie jest to problem z kodowaniem, ale problem z konfiguracją serwera. Musisz porozmawiać z administratorem systemu, aby dowiedzieć się, dlaczego tak się dzieje.
- Jeśli otrzymasz
TRUE
wartość zwrotną, nie oznacza to, że Twój e-mail na pewno zostanie wysłany. Oznacza to po prostu, że e-mail został pomyślnie wysłany do odpowiedniego modułu obsługi na serwerze przez PHP. Jest jeszcze więcej punktów awarii, na które nie ma wpływu PHP, które mogą spowodować, że wiadomość e-mail nie zostanie wysłana.
Więc FALSE
pomogą skierować Cię w dobrym kierunku, natomiast TRUE
ma nie musi oznaczać, e-mail został wysłany pomyślnie. Należy to zauważyć!
Upewnij się, że twój dostawca hostingu pozwala ci wysyłać e-maile i nie ogranicza wysyłania e-maili
Wielu współdzielonych webhostów, zwłaszcza darmowych dostawców hostingu, albo nie zezwala na wysyłanie e-maili z ich serwerów, albo ogranicza ilość, którą można wysłać w danym okresie. Wynika to z ich starań, aby spamerzy nie mogli korzystać z tańszych usług.
Jeśli uważasz, że Twój host ma ograniczenia dotyczące wysyłania wiadomości e-mail lub blokuje wysyłanie wiadomości e-mail, zapoznaj się z często zadawanymi pytaniami, aby sprawdzić, czy zawierają takie ograniczenia. W przeciwnym razie może być konieczne skontaktowanie się z obsługą klienta w celu sprawdzenia, czy istnieją jakieś ograniczenia dotyczące wysyłania wiadomości e-mail.
Sprawdź foldery spamu; zapobiegać oznaczaniu wiadomości e-mail jako spam
Często z różnych powodów wiadomości e-mail wysyłane przez PHP (i inne języki programowania po stronie serwera) trafiają do folderu spamu odbiorcy. Zawsze sprawdzaj tam przed rozwiązaniem problemu z kodem.
Aby uniknąć wysyłania poczty wysyłanej przez PHP do folderu spamu odbiorcy, możesz wykonywać różne czynności, zarówno w kodzie PHP, jak i w inny sposób, aby zminimalizować szanse, że wiadomości e-mail zostaną oznaczone jako spam. Dobre wskazówki Michiela de Mare obejmują:
- Użyj metod uwierzytelniania poczty e-mail, takich jak SPF i DKIM, aby udowodnić, że wiadomości e-mail i nazwa domeny należą do siebie, i aby zapobiec fałszowaniu nazwy domeny. Witryna SPF zawiera kreatora do generowania informacji DNS dla Twojej witryny.
- Sprawdzić swoje odwrotnego DNS , aby upewnić się, że adres IP serwera pocztowego punktów do nazwy domeny, który służy do wysyłania poczty.
- Upewnij się, że używany adres IP nie znajduje się na czarnej liście
- Upewnij się, że adres zwrotny jest prawidłowym, istniejącym adresem.
- W polu Do wpisz pełną, prawdziwą nazwę adresata, a nie tylko adres e-mail (np
"John Smith" <john@blacksmiths-international.com>
.).
- Monitoruj swoje konta nadużyć, takie jak nadużycie@twojadomena.com i postmaster@twojadomena.com. Oznacza to - upewnij się, że te konta istnieją, przeczytaj, co jest do nich wysyłane, i reaguj na skargi.
- Na koniec spraw, aby naprawdę łatwo było zrezygnować z subskrypcji. W przeciwnym razie użytkownicy anulują subskrypcję, naciskając przycisk spamu , co wpłynie na twoją reputację.
Zobacz Jak się upewnić, że wiadomości e-mail wysyłane programowo nie są automatycznie oznaczane jako spam? więcej na ten temat.
Upewnij się, że wszystkie nagłówki wiadomości są dostarczone
Niektóre programy spamujące odrzucają pocztę, jeśli brakuje w niej wspólnych nagłówków, takich jak „Od” i „Odpowiedź”:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Upewnij się, że nagłówki wiadomości nie zawierają błędów składniowych
Nieprawidłowe nagłówki są tak samo złe, jak brak nagłówków. Wystarczy jeden niepoprawny znak, aby wykoleić Twój e-mail. Sprawdź dokładnie, czy Twoja składnia jest poprawna, ponieważ PHP nie wykryje tych błędów.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Nie używaj fałszywego From:
nadawcy
Chociaż poczta musi mieć nadawcę From:, nie możesz po prostu użyć żadnej wartości. W szczególności adresy wysyłane przez użytkowników są pewnym sposobem na zablokowanie wiadomości e-mail:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Powód: twój serwer internetowy lub wysyłający nie jest na białej liście SPF / DKIM, aby udawać, że jest odpowiedzialny za adresy @hotmail lub @gmail. Może nawet po cichu upuszczać wiadomości e-mail z From:
domenami nadawców, dla których nie jest skonfigurowany.
Upewnij się, że wartość odbiorcy jest poprawna
Czasami problem jest tak prosty, jak niepoprawna wartość dla odbiorcy wiadomości e-mail. Może to być spowodowane użyciem niepoprawnej zmiennej.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Innym sposobem na sprawdzenie tego jest utrwalenie wartości odbiorcy w mail()
wywołaniu funkcji:
mail('user@example.com', $subject, $message, $headers);
Może to dotyczyć wszystkich mail()
parametrów.
Wyślij na wiele kont
Aby wykluczyć problemy z kontem e-mail, wyślij wiadomość e-mail na wiele kont e-mail u różnych dostawców poczty e-mail . Jeśli wiadomości e-mail nie docierają do konta Gmail użytkownika, wyślij te same wiadomości e-mail na konto Yahoo, Hotmail i zwykłe konto POP3 (takie jak konto e-mail dostarczone przez dostawcę usług internetowych).
Jeśli wiadomości e-mail dotrą do wszystkich lub niektórych innych kont e-mail, wiesz, że Twój kod wysyła wiadomości e-mail, ale prawdopodobnie dostawca kont e-mail blokuje je z jakiegoś powodu. Jeśli wiadomość e-mail nie dotrze do żadnego konta e-mail, problem najprawdopodobniej będzie związany z Twoim kodem.
Upewnij się, że kod odpowiada metodzie formularza
Jeśli ustawiłeś metodę formularza na POST
, upewnij się, że używasz $_POST
do szukania wartości formularza. Jeśli ustawiłeś GET
lub w ogóle go nie ustawiłeś, upewnij się, że używasz $_GET
do szukania wartości formularza.
Upewnij się, że action
wartość formularza wskazuje prawidłową lokalizację
Upewnij się, że action
atrybut formularza zawiera wartość wskazującą na kod pocztowy PHP.
<form action="send_email.php" method="POST">
Upewnij się, że host obsługuje wysyłanie wiadomości e-mail
Niektórzy dostawcy usług hostingowych nie zezwalają ani nie umożliwiają wysyłania wiadomości e-mail za pośrednictwem swoich serwerów. Przyczyny tego mogą być różne, ale jeśli wyłączyli wysyłanie poczty, będziesz musiał użyć alternatywnej metody, która korzysta z usług strony trzeciej, aby wysłać te wiadomości e-mail za Ciebie.
Wiadomość e-mail do pomocy technicznej (po podróży do pomocy technicznej online lub FAQ) powinna wyjaśnić, czy funkcje poczty e-mail są dostępne na twoim serwerze.
Upewnij się, że localhost
serwer pocztowy jest skonfigurowany
Jeśli programujesz na lokalnej stacji roboczej za pomocą WAMP, MAMP lub XAMPP, serwer e-mail prawdopodobnie nie jest zainstalowany na twojej stacji roboczej. Bez niego PHP nie może domyślnie wysyłać poczty.
Możesz temu zaradzić, instalując podstawowy serwer pocztowy. W systemie Windows możesz skorzystać z bezpłatnej poczty Mercury .
Możesz również użyć SMTP do wysyłania wiadomości e-mail. Zobacz tę wielką odpowiedź od Vikas Dwivedi aby dowiedzieć się jak to zrobić.
Włącz niestandardowe PHP mail.log
Oprócz pliku dziennika MTA i PHP możesz włączyć rejestrowanie dla tej mail()
funkcji . Nie rejestruje pełnej interakcji SMTP, ale przynajmniej parametry wywołania funkcji i skrypt wywołania.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Szczegółowe informacje można znaleźć na stronie http://php.net/manual/en/mail.configuration.php . (Najlepiej włączyć te opcje w php.ini
lub .user.ini
lub .htaccess
.)
Sprawdź za pomocą usługi testowania poczty
Istnieją różne usługi sprawdzania dostawy i spamowania, których możesz użyć do przetestowania konfiguracji MTA / serwera WWW. Zazwyczaj wysyłasz sondę pocztową na adres:, a następnie otrzymujesz raport doręczenia i więcej konkretnych awarii lub analiz później:
Użyj innego programu pocztowego
Wbudowana mail()
funkcja PHP jest przydatna i często wykonuje zadanie, ale ma swoje wady . Na szczęście istnieją alternatywy, które oferują większą moc i elastyczność, w tym radzenie sobie z wieloma problemami opisanymi powyżej:
Wszystko to można połączyć z profesjonalnym serwerem / dostawcą usług SMTP. (Ponieważ typowe wspólne plany hostingowe 08/15 są trafione lub pominięte, jeśli chodzi o konfigurację / konfigurację poczty e-mail)