Почему письма с сайта приходят таким странным образом?

Добрый день. При отправке письма из формы обратной связи, происходит любопытная вещь - при отправке первого письма - оно приходит один раз. отправляем второе (с другими данными) и это письмо приходит уже в двух экземплярах. Третье - уже в трех экземплярах, и так далее. В чем тут дело? Подозреваю, что косяк кроется где-то в js - в валидации и аяксе.

Вот html формы:
<form id="main_form" class="connection-form">
	<input class="form_elem" type="text" name="username" required placeholder="Ваше имя">
	<input id="email_inp" class="form_elem" type="email" name="usermail" required placeholder="Email">
	<textarea class="form_elem" name="usermessage" required placeholder="Ваш вопрос" maxlength="1000"></textarea>
	<div class="notification">
		<i class="fa fa-info-circle" aria-hidden="true"></i>
			<span>Все поля обязательны к заполнению</span>
		</div>
	<input id="submit" type="submit" name="submit" value="Получить консультацию">
</form>


Код отправки:
<?php

if((isset($_POST['username'])&&$_POST['username']!="")&&(isset($_POST['usermail'])&&$_POST['usermail']!="")&&(isset($_POST['usermessage'])&&$_POST['usermessage']!="")){
	$to = 'admin@yandex.ru, admin@gmail.com, admin@mail.ru';
	$subject = 'Письмо с главного лендинга';
	$message = '
				<html>
					<head>
						<title>'.$subject.'</title>
					</head>
					<body>
						<p>Имя: '.$_POST['username'].'</p>
						<p>Email: '.$_POST['usermail'].'</p>
						<p>Сообщение: '.$_POST['usermessage'].'</p>
					</body>
				</html>';
	$headers  = "Content-type: text/html; charset=utf-8 \r\n";
	$headers .= "From: Отправитель <from@example.com>\r\n";
	mail($to, $subject, $message, $headers);
}


Код валидации и отправки:
(function($) {
		$("#main_form").each(function() {
			var form = $(this),
			btn = form.find("#submit");
			form.find(".notification").addClass("empty_field");

			function isValidEmailAddress(emailAddress) {
			    // тут просто регулярка для проверки email;
			}

			function checkInput() {
				var email = $("#email_inp").val();
				form.find(".form_elem").each(function() {
					if($(this).val() !== "" && isValidEmailAddress(email)) {
						$($(".notification")).removeClass("empty_field");
					} else {
						$($(".notification")).addClass("empty_field");
					}
				});
			}

			function lightEmpty() {
				form.find(".empty_field").css({"color":"#f05442","text-decoration":"underline"});
				setTimeout(function() {
					form.find(".empty_field").removeAttr("style");
				}, 1000);
			}

			setInterval(function() {
				checkInput();
				var sizeEmpty = form.find(".empty_field").length;
				if (sizeEmpty > 0) {
					if (btn.hasClass("disabled")) {
						return false;
					} else {
						btn.addClass("disabled");
					}
				} else {
					btn.removeClass("disabled");
				}
			}, 500);

			btn.click(function() {
				if ($(this).hasClass("disabled")) {
					lightEmpty();
					return false;
				} else {
					form.submit(function() {
						var th = $(this);
						$.ajax({
							type: "POST",
							url: "../mail.php",
							data: th.serialize()
						}).done(function() {
							showPopUp($(".thanx_for_request"));
							setTimeout(function() {
								th.trigger("reset");
							}, 1000);
						});
						return false;
					});
				}
			});
		});
})(jQuery);
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
@BorisKorobkov Куратор тега PHP
Web developer
form.submit(function() {})
Это не сабмит формы, а установка обработчика при сабмите. При каждом клике на кнопку добавлется дубль обработчика.
Надо
1. btn.click(...) - удалить
2. form.submit(...) выполнять только 1 раз
3. Перед $.ajax добавить if с вашими проверками

Еще есть много замечаний:
$("#main_form").each - each бессмысленный, потому что объект с id всегда уникальный
Перед btn лучше добавить var.
$($(".notification")) - ерунда
В письме возможна инъекция, которая позволит украсть у получателя письма (админа) его доступ к почтовому ящику
И т.д.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы