Я пытался переписать форму отправки почты jQuery + PHP, но, несмотря на попытки 3 метода, все еще выдает 500 Internal Server Error. Я переписываю, потому что переношу сайт на jQuery 3 и работаю над улучшением производительности и соответствием стандартам с унаследованной мной кодовой базой.
Я знаю, что 500 - это ошибка сервера, и сайт размещен на MS IIS, но устаревший код работает на том же сервере, поэтому в моей реализации должно быть что-то особенное.
Может, ты видишь то, что я пропустил?
Приведенный ниже код в основном следует за этот пример о переполнении стека, но я также безуспешно пробовал следовать этот YouTube и этот учебник.
Надеюсь на ответ здесь после того, как исчерпал другие варианты. Заранее спасибо!
HTML (упрощенный)
<form action = "send_mail_facility2.php" id = "facility-contact-form" method = "post" autocomplete = "on">
<!-- MAIN FIELDS -->
<input id = "sendTo" name = "sendTo" type = "text" value = "Facility One" style = "display: none;">
<input id = "name" name = "name" type = "text" placeholder = "Name" required>
<input id = "email" name = "email" type = "email" placeholder = "Email" required>
<input id = "phone" name = "phone" type = "text" placeholder = "Phone number">
<textarea id = "message" name = "message" type = "text" placeholder = "Message"></textarea>
<!-- ADDITIONAL FIELDS - separate js shows section when checkbox selected -->
<input id = "infopack-checkbox" type = "checkbox" name = "checkbox" value = "checkbox"><span class = "information-pack"> I would like to receive an information pack.</span>
<div id = "address-details">
<input id = "address" name = "address" type = "text" placeholder = "Address">
<input id = "city" name = "city" type = "text" placeholder = "City">
<input id = "postcode" name = "postcode" type = "text" placeholder = "Postcode">
</div>
<!-- reCAPTCHA html & js -->
<input id = "facility-submit" name = "submit" type = "submit" value = "Send request" disabled style = "opacity: 0.3;"> <!-- disabled & inline style for captcha -->
<p class = "status" style = "display: none" role = "alert">Thanks, someone will be in contact with you regarding your enquiry soon.</p>
</form>
JS
$(function(){
var request;
$("#facility-contact-form").on("submit", function(event){
event.preventDefault();
if (request) {
request.abort();
}
var $form = $(this);
var $inputs = $form.find("input, select, button, textarea");
var serializeData = $form.serialize();
$inputs.prop("disabled", true);
request = $.ajax({
url: "send_mail_facility2.php",
type: "post",
data: serializeData
});
request.done(function (response, textStatus, jqXHR){
console.info("Hooray, it worked!");
});
request.fail(function (jqXHR, textStatus, errorThrown){
console.error("The following error occurred: "+
textStatus, errorThrown);
});
request.always(function () {
$inputs.prop("disabled", false);
});
});
});
PHP
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// email headers
$to = $_POST["sendTo"];
$subject = "Custom subject line";
$headers = "From: NoReply <[email protected]>";
// sender data
$name = $_POST["name"];
$email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
$phone = trim($_POST["phone"]);
$message = trim($_POST["message"]);
$address = isset($_POST["address"]) ? trim($_POST["address"]) : null;
$city = isset($_POST["city"]) ? trim($_POST["city"]) : null;
$postcode = isset($_POST["postcode"]) ? trim($_POST["postcode"]) : null;
//define recipients
$sendTo = $_POST["sendTo"];
if ($sendTo == 'Facility One') {
$to = '[email protected]';
} elseif ($sendTo == 'Facility Two') {
$to = '[email protected]';
} elseif ($sendTo == 'Facility Three') {
$to = '[email protected]';
}
if (isset($_POST['checkbox'])) {
$infoPack = "Yes";
} else {
$infoPack = "No";
}
if (empty($_POST["address"])) {
$address = "N/A";
} else {
}
if (empty($_POST["city"])) {
$city = "N/A";
} else {
}
if (empty($_POST["postcode"])) {
$postcode = "N/A";
} else {
}
// email content
$content = "Enquiry for facility: $sendTo\n\n";
$content .= "Name: $name\n\n";
$content .= "Email: $email\n\n";
$content .= "Phone: $phone\n\n";
$content .= "Message:\n$message\n\n";
$content .= "Would user like to receive an information pack?: $infoPack\n\n";
$content .= "Address: $address\n\n";
$content .= "City: $city\n\n";
$content .= "Postcode: $postcode\n\n\n";
$content .= "Static footer message here\n\n";
// Send the email
$success = mail($to, $subject, $content, $headers);
if ($success) {
http_response_code(200);
echo "Thanks, someone will be in contact with you regarding your enquiry soon.";
} else {
http_response_code(500);
echo "Oops, something went wrong - we couldn't send your message.";
}
} else {
// Not a POST request, set a 403 (forbidden) response code.
http_response_code(403);
echo "Oops, something went wrong - we couldn't send your message.";
}
Любые идеи?
@smith да, конечно. Но это потому, что это не работает. Если я удалю эту строку, электронная почта все равно не будет отправлена и т. д.
ну ладно, но мне не нужно читать ваш код, чтобы добраться до этой точки, 500 не проблема, так как вы ее генерируете.
Возможный дубликат Функция почты PHP не завершает отправку электронной почты
не используйте php nail (), его очень простое использование: github.com/PHPMailer/PHPMailer включает его отладку, и он сообщит вам о проблеме.
Ваш скрипт уже возвращает ошибки (что заставляет это терпеть неудачу) - pastebin.com/pDAyBNs1
Спасибо, @Darren, думаю, теперь все работает! Извините я новичок в этом ... где вы вытащили эти ошибки? Они не отображаются в моем error_log
Я просто выполнил запрос jQuery через вкладку сети Chrome. Когда вы отправляете форму, просмотрите запросы к: send_mail_facility2.php
, и он выдаст ошибки
Спасибо @Darren, который указал мне на ответ об ошибке.
Проблема, похоже, заключалась только в синтаксисе заголовка from
, который я скопировал с шага 3 этот учебник.
Я изменился:
$headers = "From: NoReply <[email protected]>";
к:
$headers = "FROM: NoReply <[email protected]>";
Я не получил этого от вопрос / ответ, который был указан как дубликат, насколько полезен этот ответ.
Для других новичков PHP используйте вкладку «Сеть» инструментов разработчика Firefox / Chrome, запустите отправку формы, отфильтруйте свой php-файл, а затем просмотрите вкладку «Ответ», чтобы увидеть полный ответ с любыми ошибками.
Хороший напарник, нам всегда помогают «простые» вещи, ха-ха!
вы выкидываете ошибку
http_response_code(500);