Перейти к содержимому


Партнерская программа Kredov

Форма обратной связи

#1 Matt

Matt
  • Пользователь
  • 774 сообщений
  • Репутация: 2
0

Отправлено 07 Ноябрь 2010 - 13:51

Я в php пока совсем не силён, но пытаюсь модифицировать под себя один скрипт обратной связи. Смысл в том, что надо добавить ещё строки для заполнения. Вот исходный скрипт, который отлично работает:
<?php
$your_email = "----@mail.ru";
if (isset($_POST['autor'])) { $autor = $_POST['autor']; if ($autor == '') { unset($autor);} }
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
if (isset($_POST['title'])) { $title = $_POST['title']; if ($title == '') { unset($title);} }
if (isset($_POST['message'])) { $message = $_POST['message']; if ($message == '') { unset($message);} }
if (empty($autor) or empty($email) or empty($title) or empty($message)) { die ("Не все поля заполнены! <a href=\"java script:history.back()\">Назад</a>"); }
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die ("Неверно введен е-mail! <a href=\"java script:history.back()\">Назад</a>"); }
$autor = addslashes($autor);
$email = addslashes($email);
$title = addslashes($title);
$message = addslashes($message);
$headers = "Content-type: text/html; charset=UTF-8 \r\n";
$headers .= "From: $autor <$email>\r\n";
if (mail($your_email, $title, $message, $headers)) {
echo ("Письмо отправлено!"); }
else {echo ("Ошибка, письмо не удалось отправить!");}
?>


А вот этот, с добавленной строкой, работать не желает:
<?php
$your_email = "-----@mail.ru";
if (isset($_POST['autor'])) { $autor = $_POST['autor']; if ($autor == '') { unset($autor);} }
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
if (isset($_POST['title'])) { $title = $_POST['title']; if ($title == '') { unset($title);} }
if (isset($_POST['poroda'])) { $poroda = $_POST['poroda']; if ($poroda == '') { unset($poroda);} }
if (isset($_POST['message'])) { $message = $_POST['message']; if ($message == '') { unset($message);} }
if (empty($autor) or empty($email) or empty($title) or empty($poroda) or empty($message)) { die ("Не все поля заполнены! <a href=\"java script:history.back()\">Назад</a>"); }
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die ("Неверно введен е-mail! <a href=\"java script:history.back()\">Назад</a>"); }
$autor = addslashes($autor);
$email = addslashes($email);
$title = addslashes($title);
$poroda = addslashes($poroda);
$message = addslashes($message);
$headers = "Content-type: text/html; charset=UTF-8 \r\n";
$headers .= "From: $autor <$email>\r\n";
if (mail($your_email, $title, $poroda, $message, $headers)) {
echo ("Письмо отправлено!"); }
else {echo ("Ошибка, письмо не удалось отправить!");}
?>


Код html (модифицированный, отображается нормально):

<p>
<style type="text/css">
input, textarea {
border: 1px solid;
} </style>
</p>
<form action="check_feedback.php" method="post">
<lable>Имя:</lable><br />
<input name="autor" type="text" /><br />
<lable>Email:</lable><br />
<input name="email" type="text" /><br />
<lable>Тема:</lable><br />
<input name="title" type="text" /><br />
<lable>Порода:</lable><br />
<input name="poroda" type="text" /><br />
<lable>Сообщение:</lable><br />
<textarea name="message"></textarea><br />
<br />
<input name="send" type="submit" value="Отправить" />&nbsp;</form>

Помогите разобраться, очень надо.

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Обратная связь на сайте
  2. Форма обратной связи на Javascript + HTML помогите!
  3. Форма обратной связи в модальном окне
  4. Добавление полей в форму обратной связи
  5. Форма обратной связи в контент материала

#2 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 07 Ноябрь 2010 - 14:02

Всё, разобрался! Так и не понял, почему сначала не отображалось).
Но теперь другой вопрос, как сделать, чтобы полсе вывода сообщения "Письмо отправлено" пользователь автоматом возвращался назад.
  • 0

#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 14:14

Matt, ещё бы она работала, почитай про функции и параметры функций
Функция mail():

bool mail (string to, string subject, string message [, string additional_headers [, string additional_parameters]])

mail() автоматически отправляет сообщение message получателю to. Можно специфицировать несколько получателей, разделив запятой адреса в to. С помощью этой функции можно высылать Email с присоединением/attachment и содержимое специальных типов. Это делается через MIME-кодировку - см. дополнительно эту статью о Zend или PEAR Mime Classes.

to - адресат, кому отправляем письмо
subject - тема письма
message - сообщение письма (текст ил может быть HTML)
additional_headers (необязательный параметр) - определение заголовков письма (например, нужен для прикрепления attach или отправки письма как HTML)
additional_parameters (необязательный параметр) - можно использовать для передачи дополнительных параметров программе, сконфигурированной для использования при отправке почты установкой конфигурации и др.

Разберем твои примеры:
1) было
mail($your_email, $title, $message, $headers)

отправляем по email $your_email
тема письма $title
сообщение письма $message
заголовки письма $headers

2) стало
mail($your_email, $title, $poroda, $message, $headers)

отправляем по email $your_email
тема письма $title
сообщение письма $poroda
заголовки письма $message
различные параметры для сервера $headers

Как видишь, у тебя в функцию отправляется в качестве параметров не то что нужно. Заголовки имеют чётко определенный формат, и если ты пошлешь вместо них какую-либо лабуду, как у тебя - посылается $poroda, то письмо не отправится.

Если ты хочешь добавить к сообщению ещё и породу кошки или ещё кого-либо надо делать так:
<?php
$your_email = "-----@mail.ru";
if (isset($_POST['autor'])) { $autor = $_POST['autor']; if ($autor == '') { unset($autor);} }
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
if (isset($_POST['title'])) { $title = $_POST['title']; if ($title == '') { unset($title);} }
if (isset($_POST['poroda'])) { $poroda = $_POST['poroda']; if ($poroda == '') { unset($poroda);} }
if (isset($_POST['message'])) { $message = $_POST['message']; if ($message == '') { unset($message);} }
if (empty($autor) or empty($email) or empty($title) or empty($poroda) or empty($message)) { die ("Не все поля заполнены! <a href=\"java script:history.back()\">Назад</a>"); }
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die ("Неверно введен е-mail! <a href=\"java script:history.back()\">Назад</a>"); }
$autor = addslashes($autor);
$email = addslashes($email);
$title = addslashes($title);
$poroda = addslashes($poroda);
$message = addslashes($message);
$message = "порода .... - {$poroda} Сообщение:" . $message;

$headers = "Content-type: text/html; charset=UTF-8 \r\n";
$headers .= "From: $autor <$email>\r\n";
if (mail($your_email, $title, $message, $headers)) {
echo ("Письмо отправлено!"); }
else {echo ("Ошибка, письмо не удалось отправить!");}
?>

  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 14:23

Matt, почитай первое сообщение

Всё, разобрался! Так и не понял, почему сначала не отображалось).
Но теперь другой вопрос, как сделать, чтобы полсе вывода сообщения "Письмо отправлено" пользователь автоматом возвращался назад.

А по поводу данного вопроса:
Возникает вопрос - а куда назад? Если на четко определенную страницу, то можно либо meta refresh либо в начале кода поставить ob_start() а в конце использовать header location
Если пользователь может отправлять письма не только с одной страницы, к примеру mail.php, а надо его вернуть на ту страницу, откуда он отправил, то:

Элемент $_SERVER['HTTP_REFERER']

В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу.


  • 0

#5 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 07 Ноябрь 2010 - 14:50

Вопрос с редиректом решил, включив вот такую штуку:
<?php
header('Refresh: 3; URL=http://------.html');
echo 'Через 3 сек. вы будете перенаправлены на новую страницу.';
exit;
?>


Но вот незадача, поправил, как ты сказал, и сообщение нормально выводится, всё работает, но не отображается тема и адрес отправителя письма.
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 15:04

Matt, код в студию
  • 0

#7 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 07 Ноябрь 2010 - 15:08

<?php
$your_email = "-----@mail.ru";
if (isset($_POST['autor'])) { $autor = $_POST['autor']; if ($autor == '') { unset($autor);} }
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
if (isset($_POST['title'])) { $title = $_POST['title']; if ($title == '') { unset($title);} }
if (isset($_POST['poroda'])) { $poroda = $_POST['poroda']; if ($poroda == '') { unset($poroda);} }
if (isset($_POST['message'])) { $message = $_POST['message']; if ($message == '') { unset($message);} }
if (empty($autor) or empty($email) or empty($title) or empty($poroda) or empty($message)) { die ("Не все поля заполнены! <a href=\"java script:history.back()\">Назад</a>"); }
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { die ("Неверно введен е-mail! <a href=\"java script:history.back()\">Назад</a>"); }
$autor = addslashes($autor);
$email = addslashes($email);
$title = addslashes($title);
$poroda = addslashes($poroda);
$message = addslashes($message);
$message = "порода - {$poroda} Сообщение:" . $message;
$headers = "Content-type: text/html; charset=UTF-8 \r\n";
$headers .= "From: $autor <$email>\r\n";
if (mail($your_email, $title, $message, $headers)) {
echo ("Письмо отправлено! "); }
else {echo ("Ошибка, письмо не удалось отправить! ");}
?><?php
header('Refresh: 3; URL=http:----.html');
echo 'Через 3 сек. вы будете перенаправлены на новую страницу.';
exit;
?>

  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 15:34

Matt, аа до этого всё было нормально, и где ты письма просматриваешь?
  • 0

#9 Matt

Matt
    Topic Starter
  • Пользователь
  • 774 сообщений
  • Репутация: 2

Отправлено 07 Ноябрь 2010 - 15:35

Нашёл ещё одну причину - кодировка. Поэтому русское имя отправителя и не приходило. Поправил на UTF-8 на Windows-1251, но в итоге появились всякие левые символы. Как же быть?
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 07 Ноябрь 2010 - 15:50

Matt, зачем ты письмо пытаешься отправить в UTF-8? Да и вообще тебе нужен HTML-формат письма? Обычно письма отправляются в koi8r делается это так:
$title =  convert_cyr_string($title, 'w', 'k');

А все дело в том, что для почты у нас принято использовать кодировку koi8-r, а для веба - win-1251 (ansi) - так, и выходит - мы шлем с сайтов в win-1251, а почтовые программы открывают его как koi8-r...

k koi8-r
w win-1251
i iso8859-5
a x-cp866
d x-cp866
m x-mac-cyrillic
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru