Почему не отправляются сообщения с формы обратной связи на 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.

    Часто задаваемые вопросы