Javascript 带有反垃圾邮件字段、PHP或JS问题的联系表单
我有一个bootstrap联系人表单,我添加了一个简单的数学公式来防止垃圾邮件。表单使用contact_me.js来处理表单,并调用contact_me.php文件来验证和发送电子邮件。它还使用jqBootstrapValidation.js验证表单。我使用了一个基本的引导模板并修改了我站点的模板,所以我没有创建实际的表单或php(或js) 表单发送电子邮件很好,但是我添加的“人类”数学等式字段不起作用,因为不管数学答案是否正确,它都会发送电子邮件。我对PHP或JS知之甚少,但我对HTML和CSS非常了解——因此我知道问题在于PHP或JS。有人能帮我解决问题所需的更新吗 HTML表单代码:Javascript 带有反垃圾邮件字段、PHP或JS问题的联系表单,javascript,php,jquery,twitter-bootstrap,Javascript,Php,Jquery,Twitter Bootstrap,我有一个bootstrap联系人表单,我添加了一个简单的数学公式来防止垃圾邮件。表单使用contact_me.js来处理表单,并调用contact_me.php文件来验证和发送电子邮件。它还使用jqBootstrapValidation.js验证表单。我使用了一个基本的引导模板并修改了我站点的模板,所以我没有创建实际的表单或php(或js) 表单发送电子邮件很好,但是我添加的“人类”数学等式字段不起作用,因为不管数学答案是否正确,它都会发送电子邮件。我对PHP或JS知之甚少,但我对HTML和CS
<div class="form-group col-xs-12 floating-label-form-group controls">
<label>Email Address</label>
<input type="email" class="form-control" placeholder="Email Address" id="email" required data-validation-required-message="Please enter your email address.">
<p class="help-block text-danger"></p>
</div>
</div>
<div class="row control-group">
<div class="form-group col-xs-12 floating-label-form-group controls">
<label>Phone Number</label>
<input type="tel" class="form-control" placeholder="Phone Number" id="phone" required data-validation-required-message="Please enter your phone number.">
<p class="help-block text-danger"></p>
</div>
</div>
<div class="row control-group">
<div class="form-group col-xs-12 floating-label-form-group controls">
<label>Message</label>
<textarea rows="5" class="form-control" placeholder="Message" id="message" required data-validation-required-message="Please enter a message."></textarea>
<p class="help-block text-danger"></p>
</div>
</div>
<div class="row control-group">
<div class="form-group col-xs-12 floating-label-form-group controls">
<label>Human</label>
<input type="text" class="form-control" placeholder="2 + 3 = ?" id="human" required data-validation-required-message="Please solve math equation to prove you are human">
<p class="help-block text-danger"></p>
</div>
</div>
<br>
<div id="success"></div>
<div class="row">
<div class="form-group col-xs-12">
<button type="submit" class="btn btn-success btn-lg">Send</button>
</div>
</div>
</form>
电子邮件地址
电话号码
消息
人类
发送
联系_Me.php代码:
<?php
// Check for empty fields
if(empty($_POST['name']) ||
empty($_POST['email']) ||
empty($_POST['phone']) ||
empty($_POST['message']) ||
empty($_POST['human']) ||
!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
{
echo "No arguments Provided!";
return false;
}
//Check if simple anti-bot test is correct
if ($human !== 5) {
$errHuman = 'Your anti-spam is incorrect';
}
$name = $_POST['name'];
$email_address = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$message = $_POST['human'];
// Create the email and send the message
$to = 'info@mysite.com'; // Add your email address inbetween the '' replacing yourname@yourdomain.com - This is where the form will send a message to.
$email_subject = "Portfolio Website Message: $name";
$email_body = "You have received a new message from your portfolio website contact form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message";
$headers = "From: noreply@mysite.com\n"; // This is the email address the generated message will be from. We recommend using something like noreply@yourdomain.com.
$headers .= "Reply-To: $email_address";
mail($to,$email_subject,$email_body,$headers);
return true;
?>
联系_me.js代码:
$(function() {
$("input,textarea").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
// additional error messages or events
},
submitSuccess: function($form, event) {
// Prevent spam click and default submit behaviour
$("#btnSubmit").attr("disabled", true);
event.preventDefault();
// get values from FORM
var name = $("input#name").val();
var email = $("input#email").val();
var phone = $("input#phone").val();
var message = $("textarea#message").val();
var human = $("textarea#human").val();
var firstName = name; // For Success/Failure Message
// Check for white space in name for Success/Fail message
if (firstName.indexOf(' ') >= 0) {
firstName = name.split(' ').slice(0, -1).join(' ');
}
$.ajax({
url: "././mail/contact_me.php",
type: "POST",
data: {
name: name,
phone: phone,
email: email,
message: message,
human: human
},
cache: false,
success: function() {
// Enable button & show success message
$("#btnSubmit").attr("disabled", false);
$('#success').html("<div class='alert alert-success'>");
$('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>×")
.append("</button>");
$('#success > .alert-success')
.append("<strong>Your message has been sent. </strong>");
$('#success > .alert-success')
.append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
error: function() {
// Fail message
$('#success').html("<div class='alert alert-danger'>");
$('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>×")
.append("</button>");
$('#success > .alert-danger').append("<strong>Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!");
$('#success > .alert-danger').append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
})
},
filter: function() {
return $(this).is(":visible");
},
});
$("a[data-toggle=\"tab\"]").click(function(e) {
e.preventDefault();
$(this).tab("show");
});
});
// When clicking on Full hide fail/success boxes
$('#name').focus(function() {
$('#success').html('');
});
$(函数(){
$(“输入,文本区域”).jqBootstrapValidation({
对,,
submitError:函数($form、event、errors){
//其他错误消息或事件
},
submitSuccess:函数($form,event){
//防止垃圾邮件点击和默认提交行为
$(“#btnSubmit”).attr(“禁用”,真);
event.preventDefault();
//从表单中获取值
变量名称=$(“输入名称”).val();
var email=$(“输入电子邮件”).val();
var phone=$(“输入电话”).val();
var message=$(“textarea#message”).val();
var human=$(“textarea#human”).val();
var firstName=name;//对于成功/失败消息
//检查名称中是否有空格以显示成功/失败消息
if(firstName.indexOf(“”)>=0){
firstName=name.split(“”).slice(0,-1).join(“”);
}
$.ajax({
url:“.//邮件/联系_me.php”,
类型:“POST”,
数据:{
姓名:姓名,,
电话:电话,,
电邮:电邮,,
讯息:讯息,,
人类:人类
},
cache:false,
成功:函数(){
//启用按钮并显示成功消息
$(“#btnSubmit”).attr(“禁用”,false);
$('#success').html(“”);
$('#success>.alert success').html(“×;”)
.附加(“”);
$(“#success>.alert success”)
.append(“您的邮件已发送。”;
$(“#success>.alert success”)
.附加(“”);
//清除所有字段
$('#contactForm')。触发器(“重置”);
},
错误:函数(){
//失败消息
$('#success').html(“”);
$('#success>.alert danger').html(“×;”)
.附加(“”);
$(“#success>.alert danger”).append(“对不起”+firstName+”,我的邮件服务器似乎没有响应。请稍后再试!”);
$(“#success>.alert danger”).append(“”);
//清除所有字段
$('#contactForm')。触发器(“重置”);
},
})
},
过滤器:函数(){
return$(this).is(“:可见”);
},
});
$(“a[数据切换=\”选项卡\“])。单击(函数(e){
e、 预防默认值();
$(此).tab(“显示”);
});
});
//单击完全隐藏失败/成功框时
$('#name')。焦点(函数(){
$('#success').html('');
});
jqBootstrapValidation.js是一个用于自动验证引导表单的插件,位于:以防止PHP发送邮件,您需要在调用脚本之前退出脚本。从代码中可以看出
if ($human !== 5) {
$errHuman = 'Your anti-spam is incorrect';
}
就是告诉你数学答案是否正确的地方。因此,您需要将其替换为:
if ($_POST['human'] != 5) {
$errHuman = 'Your anti-spam is incorrect';
return false;
}
编辑 首先添加
die($_POST['human'])代码>到您的php(无论在哪里)
然后在jquery中向success
和error
函数中添加data
参数。后跟console.log(数据);比如:
请分别更改“成功:
”
完成这些编辑后,运行脚本并查看日志。要防止PHP发送邮件,需要在调用脚本之前退出脚本。从代码中可以看出
if ($human !== 5) {
$errHuman = 'Your anti-spam is incorrect';
}
就是告诉你数学答案是否正确的地方。因此,您需要将其替换为:
if ($_POST['human'] != 5) {
$errHuman = 'Your anti-spam is incorrect';
return false;
}
编辑
首先添加die($_POST['human'])代码>到您的php(无论在哪里)
然后在jquery中向success
和error
函数中添加data
参数。后跟console.log(数据);比如:
请分别更改“成功:
”
完成这些编辑后,运行它并查看日志。在html表单中,我看不到名称字段,但它在php代码和javascript中都被引用。为了进行测试,我将此字段添加到我的表单版本中。下面的代码基于您的原始邮件,除了发送实际邮件(没有本地邮件服务器!),它会按预期处理提交。但是,在一些地方,您会回显消息,然后返回false——javascript是否使用这种回显内容
<?php
session_start();/* required if using session based captcha image */
/* If the page is accessed by GET etc then display error, otherwise process form input */
if( $_SERVER['REQUEST_METHOD']=='POST' ){
function message( $message=false, $errors=array() ){
if( $message ) return json_encode( array( 'message' => $message, 'errors'=>$errors ) );
}
$errors=array();
$options = array( 'flags' => FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_ENCODE_HIGH );
/* Filter all submitted fields */
foreach( $_POST as $field => $value ){
switch( $field ){
case 'name': $name=filter_input( INPUT_POST, $field, FILTER_SANITIZE_SPECIAL_CHARS, $options ); break;
case 'email': $email=filter_input( INPUT_POST, $field, FILTER_VALIDATE_EMAIL ); break;
case 'phone': $phone=filter_var( filter_input( INPUT_POST, $field, FILTER_SANITIZE_NUMBER_FLOAT ), FILTER_VALIDATE_FLOAT ); break;
case 'message': $message=filter_input( INPUT_POST, $field, FILTER_SANITIZE_SPECIAL_CHARS, $options ); break;
case 'human': $human=filter_var( filter_input( INPUT_POST, $field, FILTER_SANITIZE_NUMBER_INT ), FILTER_VALIDATE_INT ); break;
default:
$errors[]='Unknown field: '.$field;
break;
}
}
/* check each value is acceptable / has a value */
$variables=array($name,$email,$phone,$message,$human);
foreach( $variables as $value ){
if( !isset( $value ) or empty( $value ) ){
$errors[]='Missing parameter';
}
}
/* Integer test */
if( floatval( $human )!==floatval( $_SESSION['simple_maths_captcha'] ) ) {
$errors[]='Anti-Spam verification failed';
}
if( !empty( $errors ) ) exit( message( 'Unable to send email', $errors ) );
$to = 'info@mysite.com';
$email_subject = "Portfolio Website Message: " . $name;
$email_body = "You have received a new message from your portfolio website contact form.\n\n
Here are the details:\n\n
Name: ".$name."\n\n
Email: ".$email_address."\n\n
Phone:".$phone."\n\n
Message:\n".$message;
$headers = "From: noreply@mysite.com\n";
$headers .= "Reply-To: ".$email_address;
/* should return either true or false */
$result = @mail( $to, $email_subject, $email_body, $headers );
exit( message( 'Your message has been sent: '.$result, $errors ) );
} else {
header( 'HTTP/1.0 405 Method Not Allowed', TRUE, 405 );
$errors[]='Incorrect method';
exit( message( 'Method not allowed', $errors ) );
}
?>
由于输入类型是一个标准文本字段,我不知道它是否会有任何区别,但这应该是:-
var human = $("input#human").val();
至于实际的验证码挑战,除非该数字发生变化,否则它对垃圾邮件发送者几乎没有保护作用。通常情况下,人们会(或至少会)
<?php
/* captcha.php */
session_start();
header('Content-type: image/png');
function challenge( $full=false, $low1=1, $high1=20, $low2=1, $high2=20 ){
/* Generate an arithmetic challenge with random numbers and a random method */
$ops=array( '+','-' );
if( $full==true ) $ops=array_merge( $ops, array( '/', 'x' ) );
$numbers=array( rand( $low1, $high1 ), rand( $low2, $high2 ) );
rsort( $numbers, SORT_NUMERIC );
$key=rand( 0, count( $ops )-1 );
$question="{$numbers[0]} {$ops[ $key ]} {$numbers[1]}";
switch( $ops[ $key ] ){
case '+': $answer=( $numbers[0] + $numbers[1] ); break;
case '-': $answer=( $numbers[0] - $numbers[1] ); break;
case '/': $answer=( $numbers[0] / $numbers[1] ); break;
case 'x': $answer=( $numbers[0] * $numbers[1] ); break;
}
$obj=new stdClass;
$obj->question=$question;
$obj->answer=$answer;
return $obj;
}
/* Calculate question and answer */
$captcha=call_user_func( 'challenge', false, 1, 50, 1, 30 );
$question=$captcha->question;
$answer=$captcha->answer;
/* Set the session variable that will be tested for */
$_SESSION['simple_maths_captcha']=$answer;
/* Render an image with this challenge */
$oImg = @imagecreate( 80, 30 ) or die("unable to create image");
$background = imagecolorallocate( $oImg, 255, 255, 255 );
$colour = imagecolorallocate( $oImg, 0, 0, 0 );
imagestring( $oImg, 4, 5, 5, $question, $colour );
imagepng( $oImg );
imagedestroy( $oImg );
?>
<img src='captcha.php' alt='' width=80 height=30 />
htaccess rewrite
----------------
RewriteRule ^images/maths\.png$ /captcha.php [NC,L]
<img src='/images/maths.png' alt='' width=80 height=30 />
if( intval( $human )!==5 ) {
echo 'Anti-Spam verification failed';
return false;
}
if( floatval( $human )!==floatval( $_SESSION['simple_maths_captcha'] ) ) {
echo 'Anti-Spam verification failed';
return false;
}