Обратная связь на PHP

Описание: Всё обо всём

Eojka
Автор темы
Аватара
Eojka
Автор темы
Сообщения: 4
Зарегистрирован: 7 декабря 2015
С нами: 8 лет 3 месяца

#1 Eojka » 3 ноября 2016, 23:50

Доброго времени суток! Возникла проблема. Нужна форма обратной связи, в которой должно быть несколько полей и возможность прикреплять текстовые файлы (ограничение на расширения и на размер). Больше ничего. И чтобы все данные (информация о заявке + файл) отправлялись мне на почту.

Нашел подходящий готовый вариант, но он не работает.
Выкладываю код:

Код: Выделить всё

<?php
if 
(isset ($_POST['contactFF'])) {
  $to = "Mexanik965@yandex.ru"; // e-mail
  $from = $_POST['contactFF'];
  $subject = "Заполнена контактная форма с ".$_SERVER['HTTP_REFERER'];
  $message = "Имя: ".$_POST['nameFF']."\nКол-во страниц: ".$_POST['contactFF']."\nНомер: ".$_POST['NomFF']."\n Время ".$_POST['TimeFF']."\n ".$_POST['nameFF']."\nСообщение: ".$_POST['messageFF']."";
  $boundary = md5(date('r', time()));
  $filesize = '';
  $headers = "MIME-Version: 1.0\r\n";
  $headers .= "From: " . $from . "\r\n";
  $headers .= "Reply-To: " . $from . "\r\n";
  $headers .= "Content-Type: multipart/mixed; boundary="$boundary"\r\n";
  $message="
Content-Type: multipart/mixed; boundary="
$boundary"
 
--
$boundary
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
 
$message";
  for($i=0;$i<count($_FILES['fileFF']['name']);$i++) {
     if(is_uploaded_file($_FILES['fileFF']['tmp_name'][$i])) {
         $attachment = chunk_split(base64_encode(file_get_contents($_FILES['fileFF']['tmp_name'][$i])));
         $filename = $_FILES['fileFF']['name'][$i];
         $filetype = $_FILES['fileFF']['type'][$i];
         $filesize += $_FILES['fileFF']['size'][$i];
         $message.="
 
--
$boundary
Content-Type: "
$filetype"; name="$filename"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="
$filename"
 
$attachment";
     }
   }
   $message.="
--
$boundary--";
 
  if 
($filesize < 10000000) { // проверка на общий размер всех файлов. Многие почтовые сервисы не принимают вложения больше 10 МБ
    mail($to, $subject, $message, $headers);
    echo $_POST['nameFF'].', Ваша заявка получена, спасибо!';
  } else {
    echo 'Извините, письмо не отправлено. Размер всех файлов превышает 10 МБ.';
  }
}
?>
 
<!DOCTYPE HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Заявка на распечатку</title>
<style>
h2 {
    font-family: Tahoma;
   }
h4 {
        font-family:Tahoma;
        }
#feedback-form { /* вся форма */
  max-width: 550px;
  padding: 2%;
  border-radius: 3px;
  background: #f1f1f1;
}
#feedback-form label { /* наименование полей */
  float: left;
  display: block;
  clear: right;
}
#feedback-form .w100 { /* поля */
  float: right;
  max-width: 400px;
  width: 97%;
  margin-bottom: 1em;
  padding: 1.5%;
}
#feedback-form .border { /* граница полей */
  border-radius: 1px;
  border-width: 1px;
  border-style: solid;
  border-color: #C0C0C0 #D9D9D9 #D9D9D9;
  box-shadow: 0 1px 1px rgba(255,255,255,.5), 0 1px 1px rgba(0,0,0,.1) inset;
}
#feedback-form .border:focus {
  outline: none;
  border-color: #abd9f1 #bfe3f7 #bfe3f7;
}
#feedback-form .border:hover {
  border-color: #7eb4ea #97cdea #97cdea;
}
#feedback-form .border:focus::-moz-placeholder { /* убрать при фокусе первоначальный текст поля */
  color: transparent;
}
#feedback-form .border:focus::-webkit-input-placeholder {
  color: transparent;
}
#feedback-form .border:not(:focus):not(:hover):valid { /* правильно заполненные поля */
  opacity: .8;
}
#submitFF { /* кнопка "Отправить" */
  padding: 2%;
  border: none;
  border-radius: 3px;
  box-shadow: 0 0 0 1px rgba(0,0,0,.2) inset;
  background: #669acc;
  color: #fff;
}
#feedback-form br {
  height: 0;
  clear: both;
}
#submitFF:hover {
  background: #5c90c2;
}
#submitFF:focus {
  box-shadow: 0 1px 1px #fff, inset 0 1px 2px rgba(0,0,0,.8), inset 0 -1px 0 rgba(0,0,0,.05);
}
</style>
<center><h2>Зполните заявку</h2><br>
<form enctype="multipart/form-data" method="post" id="feedback-form">
<font style="font-family: Tahoma; font-size: 11pt;"><label for="nameFF">Введите имя:</label>
<input type="text" name="nameFF" id="nameFF" required placeholder="например, Иван Иванович Иванов" x-autocompletetype="name" class="w100 border">
<label for="contactFF">Кол-во страниц:</label>
<input type="text" name="contactFF" id="contactFF" required placeholder="например, 35" x-autocompletetype="number" class="w100 border">
<label for="NomFF">Номер:</label>
<input type="text" name="NomFF" id="contactFF" required placeholder="например, 1135" x-autocompletetype="number" class="w100 border">
<label for="TimeFF">Время получения:</label>
<input type="text" name="TimeFF" id="contactFF" required placeholder="Введите удобное время получения..." class="w100 border">
<label for="fileFF">Прикрепить файл:</label>
<input type="file" name="fileFF[]" multiple id="fileFF" class="w100">
<label for="messageFF">Ваши пожелания:</label>
<textarea name="messageFF" id="messageFF" required rows="5" placeholder="Напишите детали заявки…" class="w100 border"></textarea>
<br>
<input value="Отправить" type="submit" id="submitFF">
</form></font>
 
<script>
document.getElementById('feedback-form').addEventListener('submit', function(evt){
  var http = new XMLHttpRequest(), f = this;
  evt.preventDefault();
  http.open("POST", "contacts.php", true);
  http.onreadystatechange = function() {
    if (http.readyState == 4 && http.status == 200) {
      alert('Ваша заявка отправлена.');
      if (http.responseText.indexOf(f.nameFF.value) == 0) { // очистить поле сообщения, если в ответе первым словом будет имя отправителя
        f.messageFF.removeAttribute('value');
        f.messageFF.value='';
      }
    }
  }
  http.onerror = function() {
    alert('Извините, данные не были переданы');
  }
  http.send(new FormData(f));
}, false);
</script>
</center>

Проблема: информация не передается
Изображение

Может, у кого-то есть готовые решения?


DarkHunter
Рядовой
Рядовой
Аватара
DarkHunter
Рядовой
Рядовой
Сообщения: 7
Зарегистрирован: 18 марта 2016
С нами: 8 лет

#2 DarkHunter » 4 ноября 2016, 0:04

Выведи на экран массив post:

Код: Выделить всё

print_r($_POST);exit();


Если там нет нужных элементов, разберись, почему они в него не попадают. Если есть, разберись, почему они не попадают в письмо.

Файлы с формой html и с php находятся на одном домене? Если на разных, то нужен заголовок CORS.
К тому же объект XMLHttpReques проблемный в плане кроссбраузерности, и уж тем более поддержка старых IE до 9 версии включительно оставляет желать лучшего, в этом плане проще подключить библиотеку jQyery и спокойно использовать AJAX.

Y_Less M
Мл. сержант
Мл. сержант
Аватара
Y_Less M
Мл. сержант
Мл. сержант
Сообщения: 33
Зарегистрирован: 16 февраля 2014
С нами: 10 лет 1 месяц

#3 Y_Less » 4 ноября 2016, 23:26

Я не тестил, но, кажется, просто не хватает склейки строк.
Смотрите, строка 6:

Код: Выделить всё

$message = "Имя: ".$_POST['nameFF']."\nКол-во страниц: ".$_POST['contactFF']."\nНомер: ".$_POST['NomFF']."\n Время ".$_POST['TimeFF']."\n ".$_POST['nameFF']."\nСообщение: ".$_POST['messageFF']."";


Соответственно, дальше все строки, где создается непосредственно сообщение ($message) должны быть вида

Код: Выделить всё

$message .= ...

а не

Код: Выделить всё

$message = ...


т.е. нужно добавить точку непосредственно перед =
в частности, в строке 13 должно быть

Код: Выделить всё

$message.="
Content-Type: multipart/mixed; boundary=\"$boundary\"


И все будет работать ;)
Spam Machine

Eojka
Автор темы
Аватара
Eojka
Автор темы
Сообщения: 4
Зарегистрирован: 7 декабря 2015
С нами: 8 лет 3 месяца

#4 Eojka » 5 ноября 2016, 9:16

Хорошо, всем спасибо большое!


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Курилка»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость