Skip to content

Instantly share code, notes, and snippets.

@ArtemSites
Last active February 22, 2022 11:26
Show Gist options
  • Save ArtemSites/7845576b486bfef68898ddfe2f4b3a1a to your computer and use it in GitHub Desktop.
Save ArtemSites/7845576b486bfef68898ddfe2f4b3a1a to your computer and use it in GitHub Desktop.
Универсальный mail script - отправка формы с сайта (jQuery) | Universal mail script - submitting a form from a site (jQuery)
dependencies:
* jquery-3.4.1
<?php
// action="/index.php?route=common/order336" method="post"
class ControllerCommonOrder336 extends Controller
{
private $error = [];
public function index()
{
$json = array();
$all_right = true;
if ($this->request->server['REQUEST_METHOD'] == 'POST') {
$text = '';
if (!isset($json['error'])) {
$html = '<h3>Запрос с сайта ' . $_SERVER['SERVER_NAME'] . '</h3>';
if (isset($_REQUEST['lesson'])) {
$html .= '<p><b>Предмет: </b> ' . $this->request->post['lesson'] . '</p>';
}
if (isset($_REQUEST['input_name'])) {
$html .= '<p><b>Имя: </b> ' . $this->request->post['input_name'] . '</p>';
}
if (isset($_REQUEST['input_tel'])) {
$html .= '<p><b>Телефон: </b> ' . $this->request->post['input_tel'] . '</p>';
}
if (isset($_REQUEST['input_mail'])) {
$html .= '<p><b>E-mail: </b> ' . $this->request->post['input_mail'] . '</p>';
if (!filter_var($_REQUEST['input_mail'], FILTER_VALIDATE_EMAIL)) {
$json['error'] = 'not_valid_email';
$all_right = false;
}
}
if (!isset($_REQUEST['input_checkbox'])) {
$json['error'] = 'not_accepted';
$all_right = false;
}
if (isset($_REQUEST['g-recaptcha-response'])) {
if ($this->request->post['g-recaptcha-response'] === '') {
$json['error'] = 'no_g_recaptcha';
$all_right = false;
}
}
if ($all_right) {
$mail = new Mail();
$mail->protocol = $this->config->get('config_mail_protocol');
$mail->parameter = $this->config->get('config_mail_parameter');
$mail->hostname = $this->config->get('config_smtp_host');
$mail->username = $this->config->get('config_smtp_username');
$mail->password = $this->config->get('config_smtp_password');
$mail->port = $this->config->get('config_smtp_port');
$mail->timeout = $this->config->get('config_smtp_timeout');
$mail->setTo($this->config->get('config_email'));
$mail->setFrom($this->config->get('config_email'));
$mail->setSender($this->request->post['input_name']);
$mail->setSubject(html_entity_decode('Запрос ' . $this->request->post['input_name'], ENT_QUOTES, 'UTF-8'));
$mail->setHtml($html);
$mail->setText(html_entity_decode($text, ENT_QUOTES, 'UTF-8'));
$mail->send();
$json['success'] = true;
}
}
$this->response->setOutput(json_encode($json));
}
}
}
<form action="/index.php?route=common/order336" class="advice__form" method="POST" id="adviceForm">
<input type="hidden" name="form" value="specialist_call">
<input type="text" name="input_name" class="input input_gray" placeholder="Имя">
<input type="tel" name="input_tel" class="input input_gray js-phone" placeholder="Телефон">
<input type="email" name="input_mail" class="input input_gray" placeholder="Email">
<button type="submit" class="btn btn_blue advice__btn">Проконсультироваться</button>
<label class="checkbox js_checkbox_advice">
<input type="checkbox" name="input_checkbox" class="checkbox__checkbox js_checkbox">
<div class="checkbox__nesting">
<span class="checkbox__square"></span>
<p class="checkbox__text s-light-hel equipment-checkbox__text">
Я согласен(а) на обработку моих <a href="/konfedencialnost" class="confedent-link" target="_blank" title="Прочитать документ">Персональных данных</a>
</p>
</div>
</label>
<?php echo $captcha; ?>
</form>
$(function() {
setSendingForm($('.catalogs-form'));
function setSendingForm($targetForm) {
var $artModal = $('<div class="art-modal"></div>'); //create modal
var $artModalPellicle = $('<div class="art-modal-pellicle"></div>'); //create modal pellicle
$('html').append($artModalPellicle);
var selectorModalBtnClose = '.art-modal-close, .art-btn-modal-close';
var selectorContentOfSuccess = '#artModalSuccess'; //селектор сообщения об успешной отправки
var selectorContentOfErrorSendingAjax = '#artModalError'; //селектор сообщения об ошибке отправки ajax
var selectorContentOfErrorRecaptcha = '#artModalErrorBot'; //селектор сообщения об ошибке проверки recaptcha
var selectorContentOfErrorEmail = '#artModalErrorEmail';
var selectorContentOfNotAccepted = '#artModalErrorNotAccepted';
$targetForm.submit(function(event) {
event.preventDefault();
function viewModal(selectorOfModal) {
$(selectorOfModal).addClass('--show');
$artModal.append($(selectorOfModal));
$('html').append($artModal);
$artModalPellicle.show();
$artModal.css('display', 'inline-flex');
}
$.ajax({
type: $targetForm.attr('method'),
url: $targetForm.attr('action'),
data: $targetForm.serialize(),
success: function(response) {
console.log(response);
if (response === 'success: mail function send success') {
viewModal(selectorContentOfSuccess);
$targetForm[0].reset();
} else if (response === 'error: required input is empty') {
viewModal(artModalErrorEmpty);
} else if (response === '{"error":"no_g_recaptcha"}') {
viewModal(selectorContentOfErrorRecaptcha);
} else if (response === '{"error":"not_valid_email"}') {
viewModal(selectorContentOfErrorEmail);
} else if (response === '{"error":"not_accepted"}') {
viewModal(selectorContentOfNotAccepted);
}
},
error: function(response) {
viewModal(selectorContentOfErrorSendingAjax);
}
});
$(document).on('click keyup', function(e) {
if ($(e.target).is($artModalPellicle) || e.which === 27 || $(e.target).is(selectorModalBtnClose)) {
$('.art-modal-inner.--show').removeClass('--show');
$artModal.hide();
$artModalPellicle.hide();
}
});
});
}
});
<?
// $ar_required_input_names = ['Название организации', 'Адрес', 'ФИО', 'Телефон']; //массив имен обязательных полей
if (trim($_REQUEST["user_name_b"]) === '' && trim($_REQUEST["user_email_b"]) === '' && trim($_REQUEST["user_city_b"]) === '') { //check for spamming a robot
$method = $_SERVER['REQUEST_METHOD'];
$cc = true; //change color
$project_name = trim($_REQUEST["project_name"]);
$sender_email = trim($_REQUEST["sender_email"]);
$manager_emails = trim($_REQUEST["manager_emails"]);
$bcc_emails = trim($_REQUEST["bcc_emails"]);
$form_subject = trim($_REQUEST["form_subject"]);
// $password = trim($_REQUEST["password"]);
// $confirm_password = trim($_REQUEST["confirm_password"]);
foreach ($_REQUEST as $key => $value) {
if (
$key != "project_name" //админские настройки
&& $key != "sender_email" //служебное поле для задания email скрипта отправки
&& $key != "manager_emails" //админские настройки
&& $key != "bcc_emails" //админские настройки
&& $key != "form_subject" //админские настройки
&& $key != "user_name_b" //проверки на бота
&& $key != "user_email_b" //проверки на бота
&& $key != "user_city_b" //проверки на бота
&& $key != "submit" //проверки на кнопку отправить
&& $key != "password" //пароль, разумеется не отправляется
&& $key != "confirm_password" //пароль, разумеется не отправляется
) {
// if ($key === 'E-mail') {
// if ( !filter_var($value, FILTER_VALIDATE_EMAIL) ) {
// echo 'error: e-mail is not valid';
// return false;//не отправляем
// }
// }
// if (in_array($key, $ar_required_input_names) && empty($value)) { //если обязательное поле пусто то ошибка
// echo 'error: required input is empty';
// return false; //не отправляем
// }
if (is_array($value)) {
foreach ($value as $k => $v) {
$message .= (($c = !$c) ?
'<tr>' : '<tr style="background-color: #f8f8f8;">') . "
<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>" . str_replace('_', ' ', $key . ' ' . ++$k) . "</b></td>
<td style='padding: 10px; border: #e9e9e9 1px solid;'>" . trim($v) . "</td>
</tr>";
}
} else {
$message .= (($c = !$c) ?
'<tr>' : '<tr style="background-color: #f8f8f8;">') . "
<td style='padding: 10px; border: #e9e9e9 1px solid;'><b>" . str_replace('_', ' ', $key) . "</b></td>
<td style='padding: 10px; border: #e9e9e9 1px solid;'>" . trim($value) . "</td>
</tr>";
}
}
}
$message = "<table style='width: 100%;'>$message</table>";
function adopt($text)
{
return '=?UTF-8?B?' . Base64_encode($text) . '?=';
}
$headers = "MIME-Version: 1.0" . PHP_EOL .
"Content-Type: text/html; charset=utf-8" . PHP_EOL .
'From: ' . $sender_email . PHP_EOL .
'To: ' . $manager_emails . PHP_EOL .
'Bcc: ' . $bcc_emails . PHP_EOL .
'Reply-To: ' . $_SERVER['SERVER_NAME'] . PHP_EOL;
// if (filter_var($manager_emails, FILTER_VALIDATE_EMAIL)) {//не будет работать с массивом скорее всего
if (mail('', adopt($form_subject), $message, $headers)) {
echo 'success: mail function send success';
} else {
echo 'error: mail function send error';
return false;
}
// } else {
// echo 'error: manager e-mail is not valid!';
// return false;
// }
} else {
echo 'error: check for spamming a bot error';
return false;
}
.d-n {
display: none !important
}
.p-a {
position: absolute !important
}
.zi-999 {
z-index: -999 !important
}
.art-modal {
display: none;
justify-content: center;
align-items: center;
position: fixed;
top: 50%;
z-index: 999;
width: 100%;
height: 100%;
overflow: hidden;
outline: 0;
background-color: white;
max-width: 440px;
left: 50%;
transform: translateX(-50%) translateY(-50%);
max-height: 250px;
text-align: center;
border-radius: 5px;
box-shadow: 0 0 15px #555;
}
.art-modal-inner {
display: none;
height: 85%;
padding: 0 1em;
width: auto;
margin: auto;
flex-direction: column;
align-items: flex-start;
justify-content: space-around;
}
.art-modal-inner.--show {
display: flex;
}
.art-modal-inner__title {
font-family: "Oswald", sans-serif;
font-size: 1.6em;
text-transform: none;
text-align: left;
}
.art-modal-inner__text {
color: #474972;
font-family: "Oswald", sans-serif;
font-size: 1.2em;
text-transform: none;
text-align: left;
font-weight: 300;
}
.art-modal-close {
position: absolute;
right: 0;
top: 0;
cursor: pointer;
padding: 1em;
transition-duration: 300ms;
}
.art-modal-close:hover {
transform: rotate(-180deg) scale(1.2);
transform-origin: center;
}
.art-btn-modal-close {
margin: 0 auto;
max-width: 228px;
max-height: 44px;
width: 100%;
height: 100%;
background-color: #595882;
color: #fff;
border: 1px solid transparent;
border-radius: 0.25rem;
cursor: pointer;
text-transform: uppercase;
}
.art-modal-pellicle {
display: none;
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
z-index: 998;
cursor: pointer;
}
<h2 class="partners-call__title">Станьте нашим партнером уже сегодня</h2>
<form action="/mail/sender.php" method="post" id="partnersCall" class="partners-call__form">
<!-- Start Hidden Fields -->
<input type="hidden" name="form_subject" value="Заполнена форма на сайте «Каталоги по оборудованию»" autocomplete="off">
<input type="hidden" name="project_name" value="Заполнена форма на сайте «Каталоги по оборудованию»" autocomplete="off">
<input type="hidden" name="sender_email" value="[email protected]" autocomplete="off">
<input type="hidden" name="manager_emails" value="[email protected]" autocomplete="off">
<input type="hidden" name="bcc_emails" value="" autocomplete="off">
<input type="hidden" name="user_name_b" value="" autocomplete="off">
<input type="email" name="user_email_b" value="" class="d-n" autocomplete="off">
<input type="text" name="user_city_b" value="" class="p-a zi-999" style="background-color:transparent;border-color:transparent;color:transparent">
<input type="hidden" class="hidden" autocomplete="off" name="С какой страницы" value="https://<?= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>" />
<input type='hidden' class="hidden" name='Предшествующая страница' value='<?=$_SERVER['HTTP_REFERER']?>'>
<!-- END Hidden Fields -->
<input type="text" name="Имя" value="" required="required" class="partners-call__item"
placeholder="Представьтесь *">
<input type="text" name="Телефон" value="" required="required" class="partners-call__item art-form-tel"
placeholder="Укажите номер телефона *">
<!-- E-mail специально так, по этому имени идет валидация в скрипте -->
<input type="email" name="E-mail" value="" class="partners-call__item art-form-email"
placeholder="Укажите свой e-mail">
<!--Массив значений:-->
<input type="checkbox" name="Интересующий_каталог[]" value="Оборудование ISHA">
<input type="checkbox" name="Интересующий_каталог[]" value="Оборудование AKA">
<input class="partners-call__submit btn find-out__btn text-white" type="submit" value="Отправить заявку">
<label for="" class="partners-call__consent">Нажимая на кнопку, вы подтверждаете согласие <a href=""
class="partners-call__consent-link">на обработку персональных данных</a></label>
</form>
<div class="art-modal-inner" id="artModalSuccess">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Сообщение отправлено!</h2>
<p class="art-modal-inner__text">Спасибо за заявку!<br>Мы с вами свяжемся в ближайшее время.</p>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
<div class="art-modal-inner" id="artModalErrorBot">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Ошибка!</h2>
<p class="art-modal-inner__text art-modal-inner__text_red">Recaptcha невалидна!</p>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
<div class="art-modal-inner" id="artModalErrorNotAccepted">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Отправка отменена!</h2>
<p class="art-modal-inner__text art-modal-inner__text_red">Условия не приняты вами!</p>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
<div class="art-modal-inner" id="artModalErrorEmail">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Ошибка!</h2>
<p class="art-modal-inner__text art-modal-inner__text_red">Вы ввели невалидный email адрес!</p>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
<div class="art-modal-inner" id="artModalError">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Ошибка отправки!</h2>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
<div class="art-modal-inner" id="artModalErrorEmpty">
<span class="art-modal-close">&#10005;</span>
<h2 class="art-modal-inner__title">Отправка отменена!</h2>
<p class="art-modal-inner__text art-modal-inner__text_red">Одно или несколько обязательных полей не заполнены!</p>
<input class="art-btn-modal-close" type="submit" value="Закрыть">
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment