Как настроить SMTP для WordPress для отправки данных из формы?

Ссылка скопирована
1 ответ

- сайт на Wordpress, размещен на VPS
- в футере есть форма подписки на рассылку (сообщение отправляется на email админа, что пользователь подписан на новости)

<form action="subscribe/email.php" method="POST">     <input type="email" id="email" name="email" placeholder="Введите e-mail" required>     <input type="submit" name="subscribe" value="Подписаться">   </form>

<form action="subscribe/email.php" method="POST"> <input type="email" id="email" name="email" placeholder="Введите e-mail" required> <input type="submit" name="subscribe" value="Подписаться"> </form>

- в отдельной папке лежит файл обработчик:

<?php      $to = "admin@store.ru";      $subject = "Пользователь подписался на сайт";     $message = "Email: " . $_POST['email'] . "<br>";     $headers = "Content-type:text/html;charset=UTF-8" . "rn";     mail($to, $subject, $message, $headers); ?>

<?php $to = "admin@store.ru"; $subject = "Пользователь подписался на сайт"; $message = "Email: " . $_POST['email'] . "<br>"; $headers = "Content-type:text/html;charset=UTF-8" . "rn"; mail($to, $subject, $message, $headers); ?>

- данная форма работает, если добавить ее на тестовый сайт, который без cms и лежит на обычном хостинге
- на сайте, который на Wordpress и на VPS форма не работает
- SMTP на сайте настроил с помощью плагина "WP Mail SMTP" (если делать заказы на сайте отбивки приходят)
- предполагаю, что проблема в настройках почтового сервера и что его необходимо как-то донастроить

Буду благодарен за любую информацию

Дополнительно:

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

  • Refguser, так не хотелось стилить заново форму, но в итоге так и сделал, через CF7
    Спасибо за совет!
  • Как настроить SMTP для Wordpress для отправки данных из формы?

    1. <form action="subscribe/email.php" method="POST">
    Если включено ЧПУ, то так делать нельзя. Путь должен быть абсолютным, от корня сайта.

    2. mail($to, $subject, $message, $headers);
    Если хотите чтобы использовался плагин и соответственно вордпресс, то к скрипту надо подключать вордпресс и вызывать не mail(), а wp_mail(). Однако это хоть рабочий, но не совсем правильный подход. Правильнее сделать свой плагин и подключать скрипт к вордпрессу, а не наоборот.

    А еще правильнее не изобретать велосипед, а использовать готовый плагин обратной связи, например, CF7.

    • Благодарю за ответ,
      попробовал внести правки, поигрался с настройками, поспрашивал у gpt, ничего не помогло (видимо знаний в этой области недостаточно).
      В итоге сделал через CF7 по вашему совету, спасибо
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Юрий Linux Ответ

    На WordPress лучше не отправлять письма напрямую через отдельный email.php и функцию mail(). Такой обработчик обходит WordPress, плагины SMTP, nonce-защиту, антиспам и нормальную валидацию. Правильнее отправлять через wp_mail(), а SMTP настроить плагином вроде WP Mail SMTP, FluentSMTP или Post SMTP.

    Если форма простая, самый быстрый путь — заменить самописный обработчик на Contact Form 7/Fluent Forms и настроить SMTP. Если хотите оставить свою форму, отправку нужно проводить через WordPress AJAX или REST endpoint.

    Минимальная идея через admin-post.php:

    &lt;form action="/wp-admin/admin-post.php" method="post"&gt;
      &lt;input type="hidden" name="action" value="subscribe_email"&gt;
      &lt;input type="email" name="email" required&gt;
      &lt;button type="submit"&gt;Подписаться&lt;/button&gt;
    &lt;/form&gt;

    &lt;form action="/wp-admin/admin-post.php" method="post"&gt; &lt;input type="hidden" name="action" value="subscribe_email"&gt; &lt;input type="email" name="email" required&gt; &lt;button type="submit"&gt;Подписаться&lt;/button&gt; &lt;/form&gt;

    add_action('admin_post_nopriv_subscribe_email', 'handle_subscribe_email');
    add_action('admin_post_subscribe_email', 'handle_subscribe_email');
     
    function handle_subscribe_email() {
        $email = sanitize_email($_POST['email'] ?? '');
        if (!$email || !is_email($email)) {
            wp_die('Некорректный email');
        }
     
        wp_mail(
            get_option('admin_email'),
            'Пользователь подписался на сайт',
            'Email: ' . $email
        );
     
        wp_safe_redirect(home_url('/?subscribed=1'));
        exit;
    }

    add_action('admin_post_nopriv_subscribe_email', 'handle_subscribe_email'); add_action('admin_post_subscribe_email', 'handle_subscribe_email'); function handle_subscribe_email() { $email = sanitize_email($_POST['email'] ?? ''); if (!$email || !is_email($email)) { wp_die('Некорректный email'); } wp_mail( get_option('admin_email'), 'Пользователь подписался на сайт', 'Email: ' . $email ); wp_safe_redirect(home_url('/?subscribed=1')); exit; }

    После этого настройте SMTP-плагин: хост, порт, TLS/SSL, логин, пароль или API. Затем отправьте тестовое письмо из админки плагина. Если тест уходит, форма через wp_mail() тоже будет использовать SMTP. Так письма меньше попадают в спам и не зависят от ограничений PHP mail() на VPS.

    Важно: если форма стоит в футере на всех страницах, добавьте nonce или хотя бы простую антиспам-проверку. Иначе endpoint быстро начнут использовать боты. Для подписки также желательно не просто отправлять письмо администратору, а сохранять заявку в базе или отправлять её в сервис рассылок. Тогда при сбое почты данные не потеряются.

    После настройки SMTP проверьте не только факт доставки, но и SPF/DKIM/DMARC домена. Если отправлять письма от адреса на чужом домене или без правильных DNS-записей, даже SMTP может доставлять письма в спам.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно