我的PHP mail()脚本一直存在问题。我正在尝试为我的班级建立一个网站,用于完成家庭作业,了解即将进行的考试/课程作业的日期等。
此脚本用于将表单中的数据发送到我的电子邮件地址。我的问题是: 我试图在我的表单中包含一个字段以提高安全性。它基本上说插入“65FL7YB”以确保用户不是机器人,并且在我的PHP中,我写了以下内容:
if($_POST['valid'] = "65FL7YB") {
mail($to , $subject , $message , $header);
echo "Your Email Has Been Sent.";
} else {
echo "Your email has not been sent. Please ensure that you correctly entered the Validation Code.";
}
但是当我开始测试脚本时,发生了以下情况: 当我按照预期正确输入验证码时,页面上印有“您的电子邮件已发送”。但是,当我输入不正确的验证码时,仍然会发送“您的电子邮件已发送”。而不是“您的电子邮件尚未发送。请确保您已正确输入验证码。”
请帮助我,我花了好几个小时尝试解决这个问题(与其他知道如何编码的人一起),但我们无法证明这个问题。
如需额外参考,这是页面的完整代码:
<?php
$name = $_POST['name'];
$date = $_POST['date'];
$subject = $_POST['subject'];
$homework = $_POST['homework'];
$to = "Removed for my Privacy";
$subject = "Homework Submission";
$message = "The following has been submitted by $name. /n" . "The subject(s) is/are $subject. /n" . "Today's Homework is: /n $homework /n" . "$date";
$header = $name;
if($_POST['valid'] = "65FL7YB") {
mail($to , $subject , $message , $header);
echo "Your Email Has Been Sent.";
} else {
echo "Your email has not been sent. Please ensure that you correctly entered the Validation Code.";
}
?>
答案 0 :(得分:7)
在注意到您在评论中发布的内容后,请:
<input name="name" type="text" placeholder="Insert Your Name or Email" size="97">
您不应该使用它,您应该为Email
使用单独的输入,否则如果From:
中没有header
,则不会发送电子邮件
另外,这一行:
<form action="submit-homework-form-email.php" method="post" enctype="text/plain">
enctype="text/plain"
(脚注后更多关于此主题的内容)读作:
<form action="submit-homework-form-email.php" method="post">
现在,假设您的表单包含某人的电子邮件地址的输入字段,
我添加了$email = $_POST['email'];
加上我添加$valid = $_POST['valid'];
进行测试,否则将无法收到电子邮件。
将此$header = $name;
用作电子邮件header()
无效。
这也是无效的。你正在做一个任务,而不是检查它是否等于&#34;。
if($_POST['valid'] = "65FL7YB") {
而不是:
if($_POST['valid'] == "65FL7YB") {
=
是一项作业==
等于另一件事/n
需要更改为\n
我在测试和工作代码中添加了以下内容:
$header = "From: ".$name." <".$email.">\r\n";
$header .= "Reply-To: ".$email."\r\n";
另一件事,你在$subject
和$subject = "Homework Submission";
重复了$subject = $_POST['subject'];
我评论了$subject = "Homework Submission";
您可以从hereonin修改它。
重新格式化PHP
<?php
$email = $_POST['email']; // added for testing purposes
$valid = $_POST['valid']; // added for testing purposes
$name = $_POST['name'];
$date = $_POST['date'];
$subject = $_POST['subject'];
$homework = $_POST['homework'];
$to = "Removed for my Privacy";
// $subject = "Homework Submission";
$message = "The following has been submitted by $name. \n" . "The subject(s) is/are $subject. \n" . "Today's Homework is: \n $homework \n" . "$date";
$header = "From: ".$name." <".$email.">\r\n";
$header .= "Reply-To: ".$email."\r\n";
if($_POST['valid'] == "65FL7YB") {
mail($to , $subject , $message , $header);
echo "Your Email Has Been Sent.";
} else {
echo "Your email has not been sent. Please ensure that you correctly entered the Validation Code.";
}
?>
您还应检查是否有任何表单元素SET
或EMPTY
您未执行此操作。
如果有人未填写subject
字段,则很可能无法收到电子邮件或将以垃圾邮件结束。
最好使用这样的东西:
if(empty($_POST['subject'])){ die("You must enter a subject."); }
或
if(empty($_POST['subject'])){ echo "You must enter a subject."; exit; }
或者使用$subject = "Homework Submission";
代替$subject = $_POST['subject'];
,这样您就不需要为主题使用条件语句。
enctype
定义在发送之前应如何格式化数据。两种正确的格式是 application / x-www-form-urlencoded (基本上将内容发送为key=value&anotherkey=anothervalue
,带有http标头)和 multipart / form-data (将每个密钥分成不同的数据部分)。 text / plain 意味着什么都不应该做 - 它的行为在浏览器之间基本上是未定义的,并且在垃圾邮件发布前几天才用于自动电子邮件表单。
答案 1 :(得分:3)
您正在使用赋值运算符=
而不是比较运算符==
。
变化:
if($_POST['valid'] = "65FL7YB") {
要:
if($_POST['valid'] == "65FL7YB") {
答案 2 :(得分:1)
试试这个:
在php代码中更改if语句。
应该是这样的......
if($_POST['valid'] == "65FL7YB")
请记住=
是赋值运算符,==
是比较运算符。在if语句中,您必须使用比较运算符。
谢谢!