firebase . (http-) , , ( ) - . :
:
const functions = require('firebase-functions');
const nodemailer = require('nodemailer');
const rp = require('request-promise');
const mailTransport = nodemailer.createTransport(
`smtps://user@domain.com:password@smtp.gmail.com`);
exports.sendEmailCF = functions.https.onRequest((req, res) => {
rp({
uri: 'https://recaptcha.google.com/recaptcha/api/siteverify',
method: 'POST',
formData: {
secret: 'your_secret_key',
response: req.body['g-recaptcha-response']
},
json: true
}).then(result => {
if (result.success) {
sendEmail('recipient@gmail.com', req.body).then(()=> {
res.status(200).send(true);
});
}
else {
res.status(500).send("Recaptcha failed.")
}
}).catch(reason => {
res.status(500).send("Recaptcha req failed.")
})
});
function sendEmail(email, body) {
const mailOptions = {
from: `<noreply@domain.com>`,
to: email
};
mailOptions.subject = 'contact form message';
mailOptions.html = `<p><b>Name: </b>${body.rsName}</p>
<p><b>Email: </b>${body.rsEmail}</p>
<p><b>Subject: </b>${body.rsSubject}</p>
<p><b>Message: </b>${body.rsMessage}</p>`;
return mailTransport.sendMail(mailOptions);
}
, :
<form class="rsForm" action="/sendEmailCF" method="post">
<div class="input-field">
<label>Name</label>
<input type="text" name="rsName" value="">
<span class="line"></span>
</div>
<div class="input-field">
<label>Email</label>
<input type="email" name="rsEmail" value="">
<span class="line"></span>
</div>
<div class="input-field">
<label>Subject</label>
<input type="text" name="rsSubject" value="">
<span class="line"></span>
</div>
<div class="input-field">
<label>Message</label>
<textarea rows="4" name="rsMessage"></textarea>
<span class="line"></span>
</div>
<input type="hidden" name="rsLang" value="en" />
<span class="btn-outer btn-primary-outer ripple">
<input class="formSubmitBtn btn btn-lg btn-primary" type="submit" data-recaptcha="global" value="Send">
</span>
<div id="recaptcha-global"></div>
</form>
Script submit:
$('.formSubmitBtn').on('click', function (e) {
glForm = $(this).closest('.rsForm');
var recaptchaId = 'recaptcha-' + $(this).data('recaptcha');
var rsFormErrors = false;
glFormAction = glForm.attr('action');
var rsFormFields = glForm.find('.input-field');
var rsFormName = glForm.find("[name='rsName']");
var rsFormEmail = glForm.find("[name='rsEmail']");
var rsFormMessage = glForm.find("[name='rsMessage']");
ripple($(this).parent(), e.pageX, e.pageY);
rsFormFields.removeClass('error');
rsFormErrors = false;
if(!rsFormName.val()) {
rsFormErrors = true;
rsFormName.parent().addClass('error');
}
if(!rsFormEmail.val() || !isValidEmail(rsFormEmail.val())) {
rsFormErrors = true;
rsFormEmail.parent().addClass('error');
}
if(!rsFormMessage.val()) {
rsFormErrors = true;
rsFormMessage.parent().addClass('error');
}
if(rsFormErrors) {
return false;
} else {
if(rca[recaptchaId] === undefined){
rca[recaptchaId] = grecaptcha.render(recaptchaId, {
'sitekey' : 'sitekey',
'callback' : onExecutedCaptcha,
'size' : 'invisible',
'badge':'inline'
});
} else {
grecaptcha.reset(rca[recaptchaId]);
}
grecaptcha.execute(rca[recaptchaId]);
return false;
}
});
Script recaptcha :
function onExecutedCaptcha(token) {
var sendingMsg = null, textMsg = null, textErr = null;
var lang = glForm.find("[name='rsLang']").val();
if(lang == 'es') {
sendingMsg = 'Enviando mensaje...';
textMsg = 'Tu mensaje se ha enviado con \u00e9xito!';
textErr = 'Algo ha salido mal. Intenta mas tarde';
} else {
textMsg = 'Your email was sent successfully!';
textErr = 'Oops! Something went wrong. Please try again.';
sendingMsg = 'Sending email...';
}
swal({
text: sendingMsg,
button: false,
closeOnClickOutside: false,
closeOnEsc: false,
});
$.post( glFormAction,
glForm.serialize(),
function (response) {
grecaptcha.reset();
var data = jQuery.parseJSON( response );
swal.close();
if(data){
swal({
text: textMsg,
icon: "success",
});
glForm.find("input[type=text], input[type=email], textarea").val("");
} else {
swal({
text: textErr,
icon: "error",
});
}
}
);
}