Почему JS код не отправляет письмо?
Скрипт установил внутри 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.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
JavaScript в браузере сам по себе не отправляет письмо напрямую на почту. Нельзя безопасно отправить email из frontend-кода без серверной части, потому что SMTP-логин, API-ключ или пароль окажутся у пользователя в браузере. Поэтому проблема не только в “кривом коде”, а в неправильной архитектуре.
Правильная схема для WordPress:
wp_mail()или SMTP-плагин;Пример серверного обработчика:
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()на некоторых хостингах будет уходить в спам или не отправляться вообще.