我有一个简单的PHP页面与HTML表单.它的设置是为了让您填写表格并自动发送电子邮件到我的电子邮箱.而不是发生这种情况,我没有收到任何电子邮件,页面重定向到"找不到文件(404错误)".
这是PHP
<?php
if (isset($_POST['submit'])){
//Name
$Name = $_POST['Name'];
$Name = mysqli_real_escape_string($Name);
//Email
$Email = $_POST['Email'];
$Email = mysqli_real_escape_string($Email);
//Subject
$Subject = $_POST['Subject'];
$Subject = mysqli_real_escape_string($Subject);
//Message
$Message = $_POST['Message'];
$Message = mysqli_real_escape_string($Message);
$email_subject = $Subject . ' from: ' . $Email;
$email_from = $Email;
$email_body = $Message;
$webEmail = "temcgee@email.neit.edu";
$headers = "From: $email_from \r\n";
$headers .= "Reply-To: $Email \r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
mail($webEmail,$email_subject,$email_body,$headers);
}
?>
Run Code Online (Sandbox Code Playgroud)
这是html表单
<form action="action_page.php" name="myform">
<input onfocus="this.value='';" type="text" name="Name" value="Name" id="name">
<input onfocus="this.value='';" type="text" name="Email" value="Email" id="email">
<input onfocus="this.value='';" type="text" name="Subject" value="Subject" id="subject">
<textarea onfocus="this.value='';" cols="50" rows="4" placeholder="Message" name="Message" id="message"></textarea>
<input type="submit" value="submit" id="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这里有一些问题.
让我们从顶部开始,并使用条件语句(并按下工作).
if (isset($_POST['submit'])){...}
Run Code Online (Sandbox Code Playgroud)
您的提交按钮<input type="submit" value="submit" id="submit">没有名称属性.
修改它,使其读作:
<input type="submit" name="submit" value="submit" id="submit">
Run Code Online (Sandbox Code Playgroud)
然后你正在使用mysqli_real_escape_string()理论上要求将连接传递给该函数.
即:
$Name = mysqli_real_escape_string($connection,$Name);
Run Code Online (Sandbox Code Playgroud)
并为其他人做同样的事; 假设您正在与数据库交互.
但是,目前还不清楚您是否确实在与数据库进行交互,因此如果您没有与它进行交互,请mysqli_real_escape_string从POST阵列中删除所有这些内容.
即:
$Name = $_POST['Name'];
Run Code Online (Sandbox Code Playgroud)
并为其他人做同样的事情.
您还缺少POST作为表单中的方法:
<form action="action_page.php" name="myform">
Run Code Online (Sandbox Code Playgroud)
省略时默认为GET.因此,将其更改为:
<form action="action_page.php" name="myform" method="post">
Run Code Online (Sandbox Code Playgroud)
然后检查邮件是否已发送,更改
mail($webEmail,$email_subject,$email_body,$headers);
Run Code Online (Sandbox Code Playgroud)
至
if(mail($webEmail,$email_subject,$email_body,$headers)){
echo "Sent";
}
Run Code Online (Sandbox Code Playgroud)
如果您看到"已发送",则邮件将完成其工作.如果没有收到邮件,请检查您的垃圾邮件.或者,您的服务器可能会被列入黑名单.
确保您有权使用mail().
您还应确保使用条件填充所有输入empty().
即:
if(!empty($_POST['Name'])){
// $Name = mysqli_real_escape_string($Name);
$Name = $_POST['Name'];
}
Run Code Online (Sandbox Code Playgroud)
将错误报告添加到文件的顶部,这将有助于查找错误.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
Run Code Online (Sandbox Code Playgroud)
旁注:错误报告应该只在暂存中完成,而不是生产.
脚注:
我不知道这些用途是什么onfocus="this.value='';",如果你在某个地方发生了一些JS/Ajax,你需要检查它们.
你也应该尝试删除value="Name"和其他人,以防万一.
边注:
如果您仍然收到404错误,请尝试将PHP放在最上面,将HTML表单放在下面,并在带有.php扩展名的同一文件中,并执行以下操作:
<form action="" name="myform" method="post">
Run Code Online (Sandbox Code Playgroud)
使用action=""作为要采取的动作在同一页上的地方.
附加脚注:
我在评论中注意到你提出了另一个答案:
"我添加了标题('Location:lizbethmcgee.com/pages/Contact.php';);"
首先,确保你没有在标题之前输出.
此外,您还应该包括一个完整的http://电话exit;:
header("Location: http://www.lizbethmcgee.com/pages/Contact.php");
exit;
Run Code Online (Sandbox Code Playgroud)
为了避免进一步执行可能存在的代码,如果包含任何代码.
正如AdamT在评论中所述:
使用php mail命令发送邮件时,无法保证邮件将到达您发送给它的收件箱.如前所述,有很多垃圾邮件发送者,不幸的是,垃圾邮件过滤程度很高.如果您真的希望有更好的机会获得邮件,您应该联系GoDaddy并询问他们如何为您的帐户设置SMTP电子邮件.