I'm trying to implement mail contact form on my web page but regard so effort, I could not success. I used php captcha which is familiar to me on my previous project, but could not use it with AJAX call form.
I know in theory how process should go, but have no enough JavaScript skills to implement it at all. The problem is I have to implement captcha code into exist JavaScript and that make me trouble.
HTML FILE "contact.php" (part):
<head>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<form id="contactForm" name="sentMessage" method="POST" novalidate>
.......
<div class="form-group">
<input class="form-control" id="name" type="tel" placeholder="Your Name *" required data-validation-required-message="Please enter your name.">
<p class="help-block text-danger"></p>
</div>
........
<div class="form-group col-right-12">
<div class="g-recaptcha btn" id="captcha" data-sitekey="6Lfi2k0UAxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
</div>
</div>
<div class="col-md-6">
<div class="form-group leftt" style="border:1px solid #000; text-align:left;">
<textarea class="form-control" id="message" placeholder="Your Message *" required data-validation-required-message="Please enter a message."></textarea>
<p class="help-block text-danger"></p>
</div>
<div class="clearfix"></div>
<div class="col-lg-12 leftt">
<button id="sendMessageButton" class="btn btn-primary btn-xl text-uppercase" type="submit">Send Message</button>
</div>
</div>
</form>
JavaScript File contact_me.js
$(function() {
$("#contactForm input,#contactForm textarea").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
// additional error messages or events
},
submitSuccess: function($form, event) {
event.preventDefault(); // prevent default submit behaviour
// 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 firstName = name; // For Success/Failure Message
var captcha = grecaptcha.render(); // IS THIS CORRECT VAR DEFINITION?
// Check for white space in name for Success/Fail message
if (firstName.indexOf(' ') >= 0) {
firstName = name.split(' ').slice(0, -1).join(' ');
}
$this = $("#sendMessageButton");
$this.prop("disabled", true); // Disable submit button until AJAX call is complete to prevent duplicate messages
$.ajax({
url: "././mail/contact_me.php",
type: "POST",
data: {
name: name,
phone: phone,
email: email,
message: message,
captchaResponse: captcha
???? HOW TO CHECK IF CAPTCHA RESPONSE IS SUCCESS OR FALSE ????
},
cache: false,
success: function() {
// Success message
$('#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>").text("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");
},
complete: function() {
setTimeout(function() {
$this.prop("disabled", false); // Re-enable submit button when AJAX call is complete
}, 1000);
}
});
},
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('');
});`
PHP SCRIPT THAT SEND MAIL:
<?php
//
require_once("recaptchalib.php");
error_reporting(E_ALL & ~E_NOTICE);
if(empty($_POST['name']) ||
empty($_POST['email']) ||
empty($_POST['phone']) ||
empty($_POST['message']) ||
empty($_POST['captchaResponse']) ||
!filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))
{
echo "No arguments Provided!";
$return = "No arguments Provided!";
return false;
}
$captcha = $_POST['g-recaptcha-response'];
$secret = "6Lfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$response=json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secret."&response=".$captcha."&remoteip=".$_SERVER["REMOTE_ADDR"]), true);
$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
$captcha_success=json_decode($verify);
if ($captcha_success['success']==false) {
//This user was not verified by recaptcha.
return false;
}
else if ($response['success']!=false) {
//This user is verified by recaptcha
$name = strip_tags(htmlspecialchars($_POST['name']));
$email_address = strip_tags(htmlspecialchars($_POST['email']));
$phone = strip_tags(htmlspecialchars($_POST['phone']));
$message = strip_tags(htmlspecialchars($_POST['message']));
$to = "[email protected]";
$email_subject = "New message from $name";
$email_body = "New message from website contact form.\n\n"."DETAILS:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message\n\n";
$headers = "From: $email_address\n";
$headers .= "Reply-To: $email_address";
mail($to,$email_subject,$email_body,$headers);
return true;
}
?>`
At the end, I try to debug scripts with Mozilla Firefox debuger and find something I could not resolve what purpose is: DEBUG -> blob:https://www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f
Could not load the source for blob:https://www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f. [Exception... "Failed to open input source 'file:////www.google.com/477e0820-9f2a-4cac-8928-a4c51e87a79f'" nsresult: "0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH)" location: "JS frame :: resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/DevToolsUtils.js :: mainThreadFetch :: line 540" data: yes] Stack: mainThreadFetch@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/DevToolsUtils.js:540:5 _getSourceText/<@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/source.js:404:27 process@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:922:23 walkerLoop@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:806:7 scheduleWalkerLoop/<@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:742:11 Line: 540, column: 0