Почему не отправляются сообщения с формы обратной связи на PHP
Если на сайте, работающем на сервере Debian 11 с панелью ISPManager 6, перестали приходить письма из контактной формы, проблема может быть как в коде PHP, так и в настройках сервера. Рассмотрим основные причины, почему письма не доходят, и способы их устранения.
Типичные ошибки в PHP-обработчике формы
Код, который вы привели, содержит несколько уязвимых мест, способных блокировать отправку. Проверьте их по порядку.
Некорректная работа с multipart/mixed
В скрипте используется заголовок Content-Type: multipart/mixed, но тело письма собирается с ошибками. Строка $message= после определения $headers перезаписывает предыдущее значение $message, а затем в конце цикла к ней добавляется завершающий разделитель. Это приводит к разрыву MIME-структуры. Рекомендуем собирать письмо через PHPMailer или правильно формировать границы.
Отсутствие проверки на существование $_FILES
В форме нет поля fileFF, а в PHP-коде есть проверка if(is_uploaded_file($_FILES['fileFF']['tmp_name'])). Из-за отсутствия поля <input type="file" name="fileFF"> в HTML, массив $_FILES['fileFF'] не определён, что вызывает warning и может прервать выполнение mail().
Настройки почтового сервера в ISPManager 6
Даже если код написан верно, письма могут не отправляться из-за конфигурации Exim или Postfix на Debian 11.
Проверка работы MTA (Mail Transfer Agent)
Выполните в SSH команду:
echo "Test message" | mail -s "Test" your@email.comЕсли письмо не пришло - проблема на уровне MTA. Проверьте логи: tail -f /var/log/mail.log. Частая причина - блокировка 25 порта провайдером или отсутствие DNS-записей MX.
Отправка через внешний SMTP-релей
В ISPManager 6 можно настроить отправку всей почты через сторонний SMTP (например, Яндекс.Почта или SendGrid). Зайдите в раздел "Почтовые домены" → "Настройки отправки" и укажите параметры релея. Это решит проблему, если ваш IP в чёрных списках.
Ошибки в HTML-форме и JavaScript
Форма отправляет данные через AJAX, но в скрипте не обрабатывается случай ошибки HTTP (код не 200). Если PHP-скрипт возвращает 500 ошибку из-за синтаксической ошибки, пользователь увидит только стандартное предупреждение "Извините, данные не были переданы". Добавьте обработку ошибок:
if (http.readyState == 4) { if (http.status == 200) { alert(http.responseText); } else { alert('Ошибка сервера: ' + http.status); } }Также убедитесь, что в PHP-файле нет вывода до вызова mail() - любой пробел или символ до <?php нарушает работу заголовков.
Проверка логов веб-сервера и PHP
Откройте логи ошибок PHP (/var/log/php_errors.log или настройте через ISPManager) и логи Apache/Nginx. Ищите строки:
- PHP Fatal error - синтаксическая ошибка в коде
- mail(): Failed to connect to mailserver - не запущен MTA
- Unable to open input file - неверный путь к PHP-скрипту
После исправления всех ошибок протестируйте форму повторно. В 90% случаев проблема решается заменой встроенной функции mail() на библиотеку PHPMailer с авторизацией через SMTP.