我有一个简单的查询表单,其中只包含三个字段:名称,电子邮件和邮件。它在一个网站上工作。我在另一个网站上使用了完全相同代码的相同表单,但它只是不起作用。消息无法发送,我不断收到内部服务器错误(500)。我在不同的主机上使用了两个不同的域,但代码是相同的。我能看到的唯一区别是php版本。第一个网站使用5.5版本,另一个网站使用5.6版本(原生<<<<<< I&#D'd喜欢知道这意味着什么)。我尝试将后者切换到5.5并且它给了我一个错误:"未定义变量$ email_content on line ..."。
我的问题是,为什么它在一个站点而不是另一个站点上工作,即使使用相同的php版本和相同的代码?我错过了什么?
PHP代码:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = strip_tags(trim($_POST["name"]));
$name = str_replace(array("\r","\n"),array(" "," "),$name);
$email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
$message = trim($_POST["message"]);
if ( empty($name) OR empty($message) OR !filter_var($email, FILTER_VALIDATE_EMAIL)) {
http_response_code(400);
echo "Došlo je do greške. Molimo vas da pokušate ponovo.";
exit;
}
$recipient = "example@example.com";
$subject = "Nova poruka od $name";
$email_content .= "Ime: $name\n";
$email_content .= "Email: $email\n\n";
$email_content .= "Poruka:\n$message\n";
$email_headers = "From: $name <$email>";
if (mail($recipient, $subject, $email_content, $email_headers)) {
http_response_code(200);
echo "Hvala! Vaša poruka je poslata.";
} else {
http_response_code(500);
echo "Poruka nije poslata. Pokušajte ponovo.";
}
} else {
http_response_code(403);
echo "Došlo je do problema prilikom slanja vaše poruke. Pokušajte ponovo.";
}
?>
JS代码:
$(function() {
var form = $('#contactForm');
var formMessages = $('#form-messages');
$(form).submit(function(event) {
event.preventDefault();
var formData = $(form).serialize();
$.ajax({
type: 'POST',
url: $(form).attr('action'),
data: formData
})
.done(function(response) {
$(formMessages).removeClass('error');
$(formMessages).addClass('success');
$(formMessages).text(response);
$('#name').val('');
$('#email').val('');
$('#message').val('');
})
.fail(function(data) {
$(formMessages).removeClass('success');
$(formMessages).addClass('error');
if (data.responseText !== '') {
$(formMessages).text(data.responseText);
} else {
$(formMessages).text('Vaša poruka nije poslata. Pokušajte ponovo.');
}
});
});
});
HTML:
<form method="post" id="contactForm" action="mailer.php">
<div class="form-group">
<label for="name">Ime i prezime</label>
<input type="text" class="form-control" name="name" id="name">
</div>
<div class="form-group">
<label for="email">Email adresa</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="form-group">
<label for="message">Unesite vašu poruku</label>
<textarea class="form-control" id="message" rows="4" name="message"></textarea>
</div>
<button type="submit" class="btn btn-primary">Pošalji</button>
</form>
根据SSingh的要求更新:
<br /> <b>Notice</b>: Undefined variable: email_content in <b>/home/elektro4/public_html/mailer.php</b> on line <b>27</b><br /> Poruka nije poslata. Pokušajte ponovo.
答案 0 :(得分:0)
只是一个猜测:你的php.ini是一样的吗?特别是var sub = document.querySelectorAll("[name^='subqty']");
值(生产中必须为0)。处理display_errors
任何印刷字符时可能会造成一些麻烦。任何有帮助的error_log(php和apache)?
关于通知错误,请考虑:
http_response_code
而不是:(你结束$email_content = "Ime: $name\n";
但尚未宣布)
email_content
答案 1 :(得分:0)
变量$ email_content需要在使用它之前进行初始化。而你正试图立即增加一些价值。
尝试在$email_content = '';
$email_content .= '...';
PHP 5.5和PHP 5.6仅发送通知,因此可能还有其他内容。但是你得到的错误看起来像初始化应该有所帮助。
答案 2 :(得分:0)
您是否尝试将所有帖子变量包装在isset
:
$name = "";
if (isset($_POST["name"]) {
$name = $_POST["name"];
}
我似乎记得很久以前遇到这种情况。为每个岗位做这件事都很烦人 - 但是自从碰到它以后,我总是以上述方式做到这一点。
答案 3 :(得分:0)
事实证明,托管公司已采取安全措施,以防止使用服务器上不存在/创建的电子邮件地址。
我只需将$email_headers = "From: $name <$email>";
更改为我在cPanel中创建的电子邮件地址。
答案 4 :(得分:-1)
500错误可能是上面代码中的任何内容:
.=
运算符on not initialised variable $_POST
全球mail()
功能失败要查找错误消息,您应该检查Web服务器错误日志: