Почему JS код не отправляет письмо?

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

Скрипт установил внутри WordPress. Надо способ отправки изменить или сам код кривой?

// Инициализация переменных var ip = "127.0.0.1"; // IP-адрес по умолчанию var count = 0; // Количество посещений  // Получение IP-адреса пользователя if (window.XMLHttpRequest) {     xmlhttp = new XMLHttpRequest(); } else {     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","https://api.ipify.org",false); xmlhttp.send(); ip = xmlhttp.responseText;  // Получение количества посещений с одного IP-адреса if (localStorage.getItem(ip) !== null) {     count = parseInt(localStorage.getItem(ip)); }  // Увеличение количества посещений и сохранение в localStorage count++; localStorage.setItem(ip, count);  // Отправка письма на почту, если количество превышает 2 if (count > 2) {     var email = "*@ya.ru";     var subject = "Превышен лимит посещений с IP-адреса " + ip;     var body = "Количество посещений: " + count;     Email.send({         Host: "smtp.gmail.com",         Username: "your_email_address@gmail.com",         Password: "your_email_password",         To: email,         From: "your_email_address@gmail.com",         Subject: subject,         Body: body,     }).then(function (message) {         alert("Письмо отправлено успешно!");     }); }

// Инициализация переменных var ip = "127.0.0.1"; // IP-адрес по умолчанию var count = 0; // Количество посещений // Получение IP-адреса пользователя if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET","https://api.ipify.org",false); xmlhttp.send(); ip = xmlhttp.responseText; // Получение количества посещений с одного IP-адреса if (localStorage.getItem(ip) !== null) { count = parseInt(localStorage.getItem(ip)); } // Увеличение количества посещений и сохранение в localStorage count++; localStorage.setItem(ip, count); // Отправка письма на почту, если количество превышает 2 if (count > 2) { var email = "*@ya.ru"; var subject = "Превышен лимит посещений с IP-адреса " + ip; var body = "Количество посещений: " + count; Email.send({ Host: "smtp.gmail.com", Username: "your_email_address@gmail.com", Password: "your_email_password", To: email, From: "your_email_address@gmail.com", Subject: subject, Body: body, }).then(function (message) { alert("Письмо отправлено успешно!"); }); }

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

То что вы хотите отправить письмо на фронте - уже плохая идея

А если у вас еще и работает кусок кода "xmlhttp.responseText", то это вообще успех

Ну и логику запихивать в localStorage, который доступен пользователю и его можно изменить, тоже ничего хорошего не принесет

Уже 4-й раз обновляю комментарий, но все еще есть, что сказать.
У этого сервиса есть пример использования для Javascript.

  • Кривое всё - от идеи отправить с js, до самого кода. Используй плагины и не морочь голову.
  • Оффтоп: эта проверка в localStorage слегка бесполезная, ибо пользователи могут спокойно почистить его.
  • В WordPress письма отправляются на php с помощью функции wp_mail()
  • Нужно решить такую задачу?

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

    Заказать помощь
    Лучший ответ
    1
    Елена Вебер Ответ

    JavaScript в браузере сам по себе не отправляет письмо напрямую на почту. Нельзя безопасно отправить email из frontend-кода без серверной части, потому что SMTP-логин, API-ключ или пароль окажутся у пользователя в браузере. Поэтому проблема не только в “кривом коде”, а в неправильной архитектуре.

    Правильная схема для WordPress:

    • JS собирает данные и отправляет AJAX/REST-запрос на сайт;
    • PHP на стороне WordPress проверяет nonce и данные;
    • PHP отправляет письмо через wp_mail() или SMTP-плагин;
    • результат возвращается в JS.

    Пример серверного обработчика:

    add_action('wp_ajax_send_visit_notice', 'send_visit_notice');
    add_action('wp_ajax_nopriv_send_visit_notice', 'send_visit_notice');
     
    function send_visit_notice() {
        check_ajax_referer('visit_notice', 'nonce');
     
        $ip = sanitize_text_field($_POST['ip'] ?? '');
        $count = (int) ($_POST['count'] ?? 0);
     
        if ($count <= 2) {
            wp_send_json_success();
        }
     
        wp_mail(
            'admin@example.com',
            'Превышен лимит посещений',
            'IP: ' . $ip . ', посещений: ' . $count
        );
     
        wp_send_json_success();
    }

    add_action('wp_ajax_send_visit_notice', 'send_visit_notice'); add_action('wp_ajax_nopriv_send_visit_notice', 'send_visit_notice'); function send_visit_notice() { check_ajax_referer('visit_notice', 'nonce'); $ip = sanitize_text_field($_POST['ip'] ?? ''); $count = (int) ($_POST['count'] ?? 0); if ($count <= 2) { wp_send_json_success(); } wp_mail( 'admin@example.com', 'Превышен лимит посещений', 'IP: ' . $ip . ', посещений: ' . $count ); wp_send_json_success(); }

    Ваш JS ещё использует синхронный XMLHttpRequest к ipify — это плохо для производительности. Лучше делать асинхронно или вообще определять IP на сервере. И не рассчитывайте на localStorage как защиту: пользователь может его очистить, а боты его часто не используют.

    Если задача именно ограничить посещения по IP, храните счётчик на сервере: transient, отдельная таблица или лог с TTL. Тогда пользователь не сможет обнулить лимит очисткой браузера. Для отправки почты настройте SMTP-плагин, иначе wp_mail() на некоторых хостингах будет уходить в спам или не отправляться вообще.

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

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

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

    комментарий

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

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