Я создал на своем веб-сайте форму электронной почты для сбора электронных писем с использованием JavaScript и PHP. Первоначально я пытался предотвратить перенаправление меня на www.mywebsite.com/send_email.php с помощью функции fetch, но он все равно перенаправлял меня на другую страницу, на которой отображалось сообщение «Сообщение отправлено!» Спасибо!'. В конце концов мне удалось решить проблему, встроив скрипт в html-файл. Однако мне любопытно узнать, есть ли способ добиться того же результата при загрузке на той же домашней странице, сохраняя при этом код JavaScript в отдельном файле js, связанном с файлом html.
const form = document.getElementById('myForm');
const messageDiv = document.getElementsByName('message');
const errorMessageDiv = document.getElementById('error-message');
form.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(form);
fetch('send_email.php', {
method: 'POST',
body: formData
})
.then(response => {
if (response.ok) {
return response.text();
} else {
throw new Error('Error sending email.');
}
})
.then(message => {
messageDiv.textContent = message;
messageDiv.style.display = 'block';
form.reset();
})
.catch(error => {
errorMessageDiv.textContent = 'Message Sent! Thank you!';
errorMessageDiv.style.display = 'block';
});
});
send_email.php
<?php
$to = '[email protected]';
$from = $_POST['email'];
$name = $_POST['username'];
$subject = $_POST['subject'];
$message = $_POST['message'];
$headers = "From: $from \r\n";
$headers .= "Reply-To: $from \r\n";
$body = "Name: $name\n";
$body .= "Email: $from\n";
$body .= "Subjectt: $subject\n";
$body .= "Message:\n$message";
if (mail($to, 'New Message from Your Website', $body, $headers)) {
echo "Message sent successfully!"; // Success message
} else {
echo "An error occurred while sending the email."; // Error message
}
echo json_encode($response);
?>
Я пытался использовать выборку с index.html, но результат все равно тот же.
Тем не менее, не удивляйтесь, если не все ваши электронные письма дойдут. В наше время часть FROM электронного письма действительно сложно сделать динамичной из-за правил MTA для DNS, включая SPF и DKIM.
Вы печатаете переменную $response в конце вашего кода. Но я не мог видеть, где вы это назначили. Это может быть ошибка 500. Проверьте консоль на наличие ошибки.
Вам также не следует ставить \r\n
после последнего заголовка.
Использование fetch() определенно не приведет вас на другую страницу. Предполагаю, что, возможно, у вас возникла ошибка javascript, из-за которой он не смог обработать событие отправки формы и запустить fetch(). Попробуйте проверить консоль на наличие ошибок js.
Вас не перенаправляют.
Вы пытаетесь echo json_encode($response);
, но $response
не существует!
Таким образом, PHP выдает ошибку, и ваш Javascript переходит в раздел catch, где отображается ваше сообщение:
.catch(error => {
errorMessageDiv.textContent = 'Message Sent! Thank you!';
errorMessageDiv.style.display = 'block';
});
Попробуйте изменить свой PHP-скрипт на что-то вроде этого:
if (mail($to, 'New Message from Your Website', $body, $headers)) {
$status = 200;
$response = ['status' => 'Message sent successfully!']; // Success message
} else {
$status = 500;
$response = ['status' => 'An error occurred while sending the email.']; // Error message
}
http_response_code($status);
echo json_encode($response);
Вы можете решить эту проблему с помощью JS, однако это не обязательно. Распространенный шаблон — отправить пользователя на ваш PHP-скрипт в POST, это работает (в вашем случае отправить электронное письмо), а затем перенаправить обратно на другую страницу. Эта страница может быть исходной страницей или страницей «спасибо», или вы можете условно перенаправить в зависимости от наличия ошибки, и вы можете использовать строку квеста или сеанс для передачи сообщения об успехе или неудаче. Или AJAX/fetch с JSON для получения статуса.