Форма обратной связи посредством скрипта mail()

D7
На сайте с 23.11.2005
Offline
114
1818

Добрый день!

На сайте есть простая форма обратной связи, выполнение которой идет в скрипте

<form action="mail.php" method="post" name="mailer">

Введите ваше имя <input type="text" name="name" value=""><br><br>

Введите название вашей организации: <input type="text" name="org" value=""><br><br>

Введите тему письма: <br><input type="text" name="tema" value=""><br><br>

Введите ваш e-mail: <input type="text" name="mail" value=""><br><br>

<input type=submit value=" отправить " onClick="return FormSubmit()">

<input TYPE=reset VALUE=" очистить поля ">

</form>

В скрипте не передаются данные с формы посредством $_POST['']; например:

<?

$name = $_POST['name'];

$org = $_POST['org'];

$mail = $_POST['email'];

$tema = $_POST['tema'];

$to = "почта@mail.ru";

$mess = "С сайта www.сайт.ru было отправлено сообщение";

echo mail($to, $tema, $mess,

"From: $mail

Content-Type: text/plain; charset=windows-1251

Content-Transfer-Encoding: 8bit"

);

?>

если данные вбиты явно, то есть как с параметрами $to и $mess - то они передаются и письмо приходит с сайта.

А если данные передаются к параметрам $name, $mail, $org, &tema с форм, то письмо вообще не приходит с сайта.

В чем может быть причина? И можно как иным способом можно получить данные с форм?

minor
На сайте с 04.10.2010
Offline
70
#1

Что за функция

onClick="return FormSubmit()"

Все переменный должны быть объявленный если они не переданы, либо проверятся на пустоту если они обязательны.

$name = isset($_POST['name']) ? $_POST['name'] : '';

$org у вас вобще нигде не учитывается, все обязательные поля в ф-ю mail должны быть проверены, у вас дырявая отправка с вышей формы могут спамить, и много чего еще надо сделать

PHP experience 2 year, comprehend seo
D7
На сайте с 23.11.2005
Offline
114
#2

я привел только часть формы, параметр $org не надо учитывать

функция onClick="return FormSubmit()" - скрипт проверки заполненности форм

более интересует, почему

если данные вбиты явно, то есть как с параметрами $to и $mess - то они передаются и письмо приходит с сайта.

А если данные передаются к параметрам $name, $mail, $org, &tema с форм, то письмо вообще не приходит с сайта.

V
На сайте с 03.12.2007
Offline
94
#3

покажите полностью содержимое mail.php

а также функцию FormSubmit()

minor
На сайте с 04.10.2010
Offline
70
#4
А если данные передаются к параметрам $name, $mail, $org, &tema с форм, то письмо вообще не приходит с сайта.

Полнастью скрипт надо увидеть, если вы копировали от туда то у вас уже ошибка

D7
На сайте с 23.11.2005
Offline
114
#5

Все заработало на ура. Но есть одно но. Полученное письмо в графе "От" не содержит e-mail отправителя, стоит ящик хостера. Была беседа с хостером на эту тему, он привел пример, где параметр $headers имеет заданный e-mail и функция mail() имеет запись:

mail($to, $tema, $mess,

"From: почта@почта.ru

Content-Type: text/plain; charset=windows-1251

Content-Transfer-Encoding: 8bit"

);

В этом случае в полученном письме в графе "От" стоит e-mail отправителя. Что необходимо сделать, чтобы передавался e-mail отправителя в скрипте ниже:

Скрипт проверки заполненности полей (он работает верно)

<script>

function FormSubmit()

{

var form = document.forms[0];

var name = form.name.value;

var email = form.email.value;

var tlf = form.tlf.value;

var tema = form.tema.value;

var controlnum = form.controlnum.value;

var contt = form.contt.value;

if (name == "") {window.alert("Ваше имя не введено"); return false;}

if (email == "") {window.alert("Ваш e-mail не введен"); return false;}

if (tlf == "") {window.alert("Введите номер телефона"); return false;}

if (tema == "") {window.alert("Тема не введена"); return false;}

if (controlnum != "159035") {window.alert("Введите правильно контрольное число"); return false;}

if (contt == "") {window.alert("Сообщение не должно быть пустым"); return false;}

return true;

}

</script>

Форма отправки сообщения

<form action="post.php" method="post" name="mailer">

Введите ваше имя: <br><input type="text" name="name" value="">

Введите название вашей организации: <br><input type="text" name="org" value="">

Введите ваш e-mail: <br><input type="text" name="email">

Введите ваш телефон: <br><input type="text" name="tlf" value="">

Введите тему письма: <br><input type="text" name="tema" value="">

Контрольное число: <br><input type="text" name="controlnum" value="">

Введите текст письма: <br><textarea name="contt" cols="60" rows="7"></textarea>

<input type=submit value=" отправить " onClick="return FormSubmit()">

<input TYPE=reset VALUE=" очистить поля ">

</form>

Код post.php:

<?

if (isset($_POST['name'])) {$name = $_POST['name'];}

if (isset($_POST['org'])) {$org = $_POST['org'];}

if (isset($_POST['email'])) {$email = $_POST['email'];}

if (isset($_POST['tlf'])) {$tlf = $_POST['tlf'];}

if (isset($_POST['tema'])) {$tema = $_POST['tema'];}

if (isset($_POST['contt'])) {$contt = $_POST['contt'];}

$to = "почта@mail.ru";

$mess = "С сайта www.сайт.ru было отправленно сообщение.

Имя отправителя - $name;

Организация отправителя - $org;

e-mail отправителя - $email;

телефон отправителя - $tlf;

Сообщение:

$contt";

$headers = 'Content-type: text/plain; charset="windows-1251"';

$headers .= "From: <" . $email . "> ";

$headers .= "Return-path: <" . $email . "> ";

mail($to, $tema, $mess, $headers);

echo ('<html><head>

<meta http-equiv="content-type" content="text/plain; charset=windows-1251">

<meta http-equiv="refresh" content="0; url=feedback.html">

</head></body></html>');

?>

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#6

$headers = "Content-type: text/plain; charset="windows-1251\r\n"';

$headers .= "From: $email\r\n";

$headers .= "Return-path: $email\r\n";

\r - спец.символ в ПХП - возврат коретки.

\n - тоже спец символ - перенос строки.

Так вот, наш ENTER по разному "обозначается" в Win и *Nix системах.

\r\n - Windows

\n - *nix-системы

Попробуйте по разному, если не знаете что за ОС на Вашем сервере.

ЗЫ. взято из мануала по ПХП.

Замечание: When sending mail, the mail must contain a From header. This can be set with the additional_headers parameter, or a default can be set in php.ini.

Когда отправляется письмо, оно должно содержать заголовок FROM, либо же это можно установить в PHP.INI по умолчанию.

Подпись))
D7
На сайте с 23.11.2005
Offline
114
#7
Милованов Ю.С:
$headers = "Content-type: text/plain; charset="windows-1251\r\n"';
$headers .= "From: $email\r\n";
$headers .= "Return-path: $email\r\n";
\r - спец.символ в ПХП - возврат коретки.
\n - тоже спец символ - перенос строки.
Так вот, наш ENTER по разному "обозначается" в Win и *Nix системах.
\r\n - Windows
\n - *nix-системы
Попробуйте по разному, если не знаете что за ОС на Вашем сервере.

ЗЫ. взято из мануала по ПХП.
Замечание: When sending mail, the mail must contain a From header. This can be set with the additional_headers parameter, or a default can be set in php.ini.
Когда отправляется письмо, оно должно содержать заголовок FROM, либо же это можно установить в PHP.INI по умолчанию.

спасибо за подсказку, но не сработало

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#8

Тогда обратитесь к хостеру, и скажите, что не получается.

У меня такое тоже было.

Видимо дефолтное значение в PHP.INI имеет больший вес, чем то что Вы указываете.

Утверждать не буду, но как показала практика, не со всех хостингов можно свой заголовок FROM передавать. Где-то получается, а где-то подставляется адрес хостинга.

Попробуйте написать хостеру об этой проблеме. Как решится - отпишите в теме. Интересно.

D7
На сайте с 23.11.2005
Offline
114
#9

такая проблема у меня была с nic.ru. с ними проблема была решена очень просто, в ручную в панели управления хостинга добавил адреса получателей писем в доверительный список и все заработало.

а с 1gb.ru - проблема...

IL
На сайте с 20.04.2007
Offline
435
#10

$headers = 'Content-type: text/plain; charset="windows-1251"';

$headers .= "From: <" . $email . "> ";
$headers .= "Return-path: <" . $email . "> ";

Заменить на

$headers = 

"Content-type: text/html; charset=windows-1251" . "\r\n".
"From: $email" . "\r\n".
"Return-path: $email" . "\r\n"
;
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий