Хоча є частини цього відповіді, які стосуються лише використанняmail()
функції, багато з цих етапів усунення несправностей можуть бути застосовані до будь-якої системи розсилки PHP.
Існує безліч причин, за якими ваш сценарій не надсилає електронні листи. Діагностувати ці речі важко, якщо немає явної синтаксичної помилки. Без жодного вам потрібно пройти через контрольний список нижче, щоб знайти потенційні підводні камені, з якими ви можете зіткнутися.
Переконайтеся, що увімкнено повідомлення про помилки та встановлено, щоб повідомляти про всі помилки
Повідомлення про помилки має важливе значення для усунення помилок у вашому коді та загальних помилок, з якими стикається PHP. Щоб отримувати ці помилки, потрібно увімкнути повідомлення про помилки. Якщо розмістити наступний код у верхній частині файлів PHP (або в головному файлі конфігурації), ви зможете повідомити про помилки.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
Див. Як я можу отримати корисні повідомлення про помилки в PHP? - ця відповідь для більш детальної інформації про це.
Переконайтеся, що mail()
функція викликана
Це може здатися дурним, але поширена помилка - забути насправді розмістити своє місце mail()
функцію у своєму коді. Переконайтесь, що він там є, а не коментується.
Переконайтесь, що mail()
функція викликана правильно
bool mail (рядок $ to, string $ subject, string $ message [, рядок $ Additional_headers [, рядок $ Additional_parameters]])
Функція пошти приймає три необхідні параметри та необов'язково четвертий та п'ятий. Якщо ваш дзвінок наmail()
не має принаймні трьох параметрів, він вийде з ладу.
Якщо ваш дзвінок на mail()
не має правильних параметрів у правильному порядку, він також не вдасться.
Перевірте журнали пошти сервера
Ваш веб-сервер повинен реєструвати всі спроби надсилання електронної пошти через нього. Розташування цих журналів буде відрізнятися (можливо, вам доведеться запитати адміністратора сервера, де вони знаходяться), але їх зазвичай можна знайти в кореневій директорії користувача під logs
. Всередині будуть повідомлення про помилки, про які повідомляється сервер, якщо такі є, пов’язані з вашими спробами надсилання електронних листів.
Перевірте наявність порту підключення
Блок порту є дуже поширеною проблемою, з якою стикається більшість розробників, інтегруючи свій код для доставки електронних листів за допомогою SMTP. І це легко простежується в поштових журналах сервера (місце розташування сервера журналу пошти може відрізнятися від сервера до сервера, як пояснено вище). Якщо ви перебуваєте на спільному сервері хостингу, порти 25 і 587 залишаються заблокованими за замовчуванням. Цей блок спеціально зробив ваш хостинг-провайдер. Це справедливо навіть для деяких виділених серверів. Коли ці порти заблоковані, спробуйте підключитися за допомогою порту 2525. Якщо ви виявите, що порт також заблокований, єдине рішення - зв’язатися зі своїм постачальником хостингу, щоб розблокувати ці порти.
Більшість хостинг-провайдерів блокують ці порти електронної пошти, щоб захистити їх мережу від надсилання будь-яких спам-листів.
Використовуйте порти 25 або 587 для звичайних / TLS-з'єднань і порт 465 для з'єднань SSL. Для більшості користувачів рекомендується використовувати порт 587, щоб уникнути обмежень тарифів, встановлених деякими хостинг-провайдерами.
Не використовуйте оператора придушення помилок
Коли оператор придушення помилок @
створює претензію на вираз у PHP, будь-які повідомлення про помилки, які можуть бути згенеровані цим виразом, ігноруються. Є обставини, коли використання цього оператора є необхідним, але відправлення пошти не є однією з них.
Якщо ваш код містить, @mail(...)
то ви можете приховувати важливі повідомлення про помилки, які допоможуть вам налагодити це. Вийміть @
і перевірте, чи повідомляються про якісь помилки.
Це доцільно лише тоді, коли ви відразу ж перевірите наявністьerror_get_last()
конкретних відмов.
Перевірте mail()
значення повернення
mail()
функція:
Повертається, TRUE
якщо повідомлення було успішно прийнято для доставки, в FALSE
іншому випадку. Важливо зауважити, що лише тому, що пошта була прийнята для доставки, це НЕ означає, що пошта дійсно досягне призначеного пункту призначення.
Це важливо зазначити, оскільки:
- Якщо ви отримуєте
FALSE
повернене значення, ви знаєте, що помилка полягає в тому, що ваш сервер приймає вашу пошту. Це, ймовірно, не проблема кодування, а проблема конфігурації сервера. Вам потрібно поговорити з вашим системним адміністратором, щоб з’ясувати, чому це відбувається.
- Якщо ви отримаєте
TRUE
повернене значення, це не означає, що ваш електронний лист обов’язково буде надісланий. Це просто означає, що повідомлення електронною поштою було надіслано PHP відповідному обробнику на сервері. Ще є точки відмови поза контролем PHP, які можуть призвести до не надсилання електронної пошти.
Таким чином, FALSE
ви допоможете направити вас у правильному напрямку, тоді як TRUE
це не обов'язково означає, що ваш електронний лист був відправлений успішно. Це важливо відзначити!
Переконайтеся, що ваш постачальник послуг хостингу дозволяє вам надсилати електронні листи та не обмежує надсилання пошти
Багато спільних веб-хостингів, особливо безкоштовні провайдери хостингу, або не дозволяють надсилати електронні листи зі своїх серверів, або обмежують кількість, яку можна надіслати протягом будь-якого певного періоду часу. Це пов’язано з їхніми зусиллями щодо обмеження спамерів від використання їх дешевших послуг.
Якщо ви вважаєте, що у вашого хоста є обмеження в електронній пошті або заблоковано надсилання електронних листів, перегляньте їхні поширені запитання, щоб побачити, чи є в них такі обмеження. В іншому випадку вам може знадобитися звернутися до їх підтримки, щоб перевірити, чи існують обмеження щодо надсилання електронних листів.
Перевірте папки зі спамом; не допускати позначення листів як спаму
Часто з різних причин електронні листи, що надсилаються через PHP (та інші мови програмування на стороні сервера), потрапляють у папку спаму одержувача. Завжди перевіряйте там, перш ніж усунути проблеми з кодом.
Щоб уникнути пошти, надісланої через PHP, до папки спаму одержувача, ви можете зробити різні дії, як у своєму PHP-коді, так і в іншому випадку, щоб мінімізувати ймовірність того, що ваші електронні листи будуть позначені як спам. Хороші поради від Міхель де Маре включають:
- Використовуйте методи аутентифікації електронної пошти, такі як SPF та DKIM, щоб довести, що ваші електронні листи та ваше доменне ім’я належать разом, і щоб запобігти підробленню вашого доменного імені. Веб-сайт SPF включає майстра для генерування інформації про DNS для вашого сайту.
- Перевірте свою зворотну DNS, щоб переконатися, що IP-адреса вашого поштового сервера вказує на доменне ім’я, яке ви використовуєте для надсилання пошти.
- Переконайтеся, що IP-адресу, яку ви використовуєте, немає у чорному списку
- Переконайтеся, що адреса відповіді - дійсна, існуюча адреса.
- Використовуйте повне справжнє ім’я адресата в полі Ко, а не лише адресу електронної пошти (наприклад
"John Smith" <john@blacksmiths-international.com>
).
- Контролюйте свої облікові записи, такі як abuse@yourdomain.com та postmaster@yourdomain.com. Це означає - переконайтеся, що ці облікові записи існують, прочитайте, що їм надсилається, і дійте за скаргами.
- І, нарешті, зробити це дуже легко відмовитися від підписки. В іншому випадку ваші користувачі скасують підписку, натиснувши кнопку спаму , і це вплине на вашу репутацію.
Див. Як ви переконаєтесь, що електронний лист, який ви надсилаєте програмно, не позначається автоматично як спам? детальніше з цієї теми.
Переконайтеся, що всі заголовки пошти надані
Деякі програми для спаму будуть відхиляти пошту, якщо в ній відсутні загальні заголовки, такі як "Від" та "Відповісти до":
$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);
Переконайтесь, що в заголовках пошти немає синтаксичних помилок
Недійсні заголовки такі ж погані, як і відсутність заголовків. Один неправильний символ може бути всього, що потрібно, щоб зірвати вашу електронну пошту. Двічі перевірте, щоб переконатися, що ваш синтаксис правильний, оскільки PHP не спричинить ці помилки для вас.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Не використовуйте підроблений From:
відправник
Хоча в пошті має бути відправник від: Ви можете не просто використовувати якесь значення. Зокрема, адреси відправника, надіслані користувачем, є надійним способом заблокувати пошту:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
Причина: ваш веб-сервер або поштовий сервер не має списку SPF / DKIM, щоб претендувати на відповідальність за адреси @hotmail або @gmail. Він може навіть мовчки скидати пошту з From:
доменами відправника, для яких не налаштовано.
Переконайтесь, що значення одержувача правильне
Іноді проблема настільки проста, як неправильне значення для одержувача електронної пошти. Це може бути пов’язано з використанням неправильної змінної.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Інший спосіб перевірити це - жорсткий код значення одержувача у mail()
виклик функції:
mail('user@example.com', $subject, $message, $headers);
Це може стосуватися всіх mail()
параметрів.
Надіслати на кілька облікових записів
Щоб усунути проблеми з обліковим записом електронної пошти, надішліть електронну пошту на кілька облікових записів електронної пошти у різних постачальників електронної пошти . Якщо ваші електронні листи не надходять до облікового запису Gmail, надсилайте ті самі електронні листи до облікових записів Yahoo, Hotmail і звичайного облікового запису POP3 (як-от ваш електронний рахунок, наданий провайдером).
Якщо електронні листи надходять до всіх або інших облікових записів електронної пошти, ви знаєте, що ваш код надсилає електронні листи, але ймовірно, що постачальник облікових записів електронної пошти блокує їх з якихось причин. Якщо електронний лист не надходить до жодного облікового запису електронної пошти, швидше за все, проблема буде пов’язана з вашим кодом.
Переконайтесь, що код відповідає методу форми
Якщо ви встановили метод форми POST
, переконайтеся, що використовуєте $_POST
для пошуку значень форми. Якщо ви встановили його GET
взагалі або не встановили, переконайтесь, що ви $_GET
шукаєте значення форми.
Переконайтесь, що action
значення форми вказує на правильне розташування
Переконайтеся, що action
атрибут форми містить значення, яке вказує на ваш поштовий код PHP.
<form action="send_email.php" method="POST">
Переконайтеся, що веб-хост підтримує надсилання електронної пошти
Деякі провайдери веб-хостингу не дозволяють і не дозволяють надсилати електронні листи через свої сервери. Причини цього можуть бути різними, але якщо вони відключили відправлення пошти, вам потрібно буде використовувати альтернативний метод, який використовує третю сторону для надсилання цих листів для вас.
Електронний лист до їх технічної підтримки (після поїздки до їхньої онлайн-підтримки або поширених запитань) повинен уточнити, чи є можливості електронної пошти доступні на вашому сервері.
Переконайтеся, що localhost
поштовий сервер налаштований
Якщо ви розробляєте локальну робочу станцію за допомогою WAMP, MAMP або XAMPP, сервер електронної пошти, ймовірно, не встановлений на вашій робочій станції. Без цього PHP не може надсилати пошту за замовчуванням.
Ви можете подолати це, встановивши базовий поштовий сервер. Для Windows ви можете скористатися безкоштовною Mercury Mail .
Ви також можете використовувати SMTP для надсилання електронної пошти. Дивіться цю чудову відповідь від Vikas Dwivedi, щоб дізнатися, як це зробити.
Увімкніть користувальницький PHP mail.log
Окрім файлу журналу MTA та PHP, ви можете увімкнути ведення журналу для цієї mail()
функції спеціально. Він не записує повну взаємодію SMTP, але принаймні функціональні параметри виклику та сценарій виклику.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
Докладні відомості див. У розділі http://php.net/manual/en/mail.configuration.php . (Найкраще , щоб включити ці параметри в php.ini
або .user.ini
або .htaccess
можливо.)
Зверніться до служби тестування пошти
Існують різні служби доставки та перевірки спаму, які ви можете використовувати для тестування налаштувань MTA / веб-сервера. Зазвичай ви надсилаєте поштовий зонд на адресу: їх адресу, потім отримуєте звіт про доставку та більш конкретні збої чи аналізи пізніше:
Використовуйте іншу пошту
Вбудована mail()
функція PHP зручна і часто виконує роботу, але у неї є свої недоліки . На щастя, є альтернативи, які пропонують більшу потужність та гнучкість, включаючи вирішення багатьох питань, описаних вище:
Все це може поєднуватися з професійним SMTP-сервером / постачальником послуг. (Оскільки типові плани 08/15 для спільного веб-хостингу потрапляють або пропускають, коли мова заходить про налаштування / налаштування електронної пошти.)