Проверка функции php mail() на хостинге (отправка писем). SMTP.

Оглавление

Иногда бывают случаи, что причиной неработающих форм связи на сайте является вовсе не проблема в коде этих форм, а проблема в самом хостинге.

Проверить отправляет ли вообще хостинг письма довольно просто:

  • Подключитесь по FTP к сайту

  • Создайте в корне php файл, например https://site.ru/test-mail.php

  • Внутри файла размещаем следующий код

<?php
if (mail("test@example.com", "заголовок", "текст")) {
    echo 'Отправлено';
}
else {
    echo 'Не отправлено';
} ?>

Обращаемся к файлу через frontend например https://site.ru/test-mail.php . В зависимости от echo мы поймём работает функция mail() или нет.

Причин данной проблемы может быть много, это и блокировка функции хостером из-за подозрений в спаме с сайта, настройки конфигурации сервера и прочее.

Для начала стоит обратиться в техподдержку хостинга для уточнения причин, если всё же данная функция вам недоступна - есть вариант решения проблемы, можно использовать https://ru.wikipedia.org/wiki/SMTP .

Если формы связи созданы через плагины CMS, то стоит смотреть документацию к ним и к CMS, например настройки https://ru.wikipedia.org/wiki/SMTP в Modx находятся в разделе core /manager/?a=system/settings .

Если на сайте используются самописные решения или надо написать свою форму с https://ru.wikipedia.org/wiki/SMTP , то существуют специальные php библиотеки например https://github.com/PHPMailer/PHPMailer

В файле-обработчике формы связи подключаем библиотеку, например

require_once 'sender.php';
$sender = new sender;    

В файле sender.php находятся настройки и пути библиотеки https://github.com/PHPMailer/PHPMailer в которых прописаны логин, пароль, порт, сервер почты и т.д.

Вместо функции mail() отправка письма в обработчике будет выглядеть следующим образом

$message_data = array(
    'email'     => $_POST['email'],
    'name'      => $_POST['name'],
    'title'     => $sender->mail_content['title'],
    'text'      => $message_text,
    'alt_text'  => strip_tags($message_text)
);
$mailSend = $sender->sendMail($sender->smtp_data, $message_data);