09.04.2016, 11:58
|
|
Аспирант
|
|
Регистрация: 27.04.2014
Сообщений: 41
|
|
Сломалась форма
Сломалась форма обратной связи.
Если не заполнять поле с "мылом" то письма приходят.
Как поле "мыло" заполнишь-тишина.
Выложу код,сорри если корявый..сделано в конструкторе.
<?php
function ValidateEmail($email)
{
$pattern = '/^([0-9a-z]([-.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,6})$/i';
return preg_match($pattern, $email);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['formid']) && $_POST['formid'] == 'indexform1')
{
$mailto = 'сюда_письма_приходят@ya.ru';
$mailfrom = isset($_POST['email']) ? $_POST['email'] : $mailto;
$subject = 'Website form';
$message = 'Values submitted from web site form:';
$success_url = '';
$error_url = '';
$error = '';
$eol = "\n";
$max_filesize = isset($_POST['filesize']) ? $_POST['filesize'] * 1024 : 1024000;
$boundary = md5(uniqid(time()));
$header = 'From: '.$mailfrom.$eol;
$header .= 'Reply-To: '.$mailfrom.$eol;
$header .= 'MIME-Version: 1.0'.$eol;
$header .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"'.$eol;
$header .= 'X-Mailer: PHP v'.phpversion().$eol;
if (!ValidateEmail($mailfrom))
{
$error .= "The specified email address is invalid!\n<br>";
}
if (!empty($error))
{
$errorcode = file_get_contents($error_url);
$replace = "##error##";
$errorcode = str_replace($replace, $error, $errorcode);
echo $errorcode;
exit;
}
$internalfields = array ("submit", "reset", "send", "filesize", "formid", "captcha_code", "recaptcha_challenge_field", "recaptcha_response_field", "g-recaptcha-response");
$message .= $eol;
$message .= "IP Address : ";
$message .= $_SERVER['REMOTE_ADDR'];
$message .= $eol;
$logdata = '';
foreach ($_POST as $key => $value)
{
if (!in_array(strtolower($key), $internalfields))
{
if (!is_array($value))
{
$message .= ucwords(str_replace("_", " ", $key)) . " : " . $value . $eol;
}
else
{
$message .= ucwords(str_replace("_", " ", $key)) . " : " . implode(",", $value) . $eol;
}
}
}
$body = 'This is a multi-part message in MIME format.'.$eol.$eol;
$body .= '--'.$boundary.$eol;
$body .= 'Content-Type: text/plain; charset=UTF-8'.$eol;
$body .= 'Content-Transfer-Encoding: 8bit'.$eol;
$body .= $eol.stripslashes($message).$eol;
if (!empty($_FILES))
{
foreach ($_FILES as $key => $value)
{
if ($_FILES[$key]['error'] == 0 && $_FILES[$key]['size'] <= $max_filesize)
{
$body .= '--'.$boundary.$eol;
$body .= 'Content-Type: '.$_FILES[$key]['type'].'; name='.$_FILES[$key]['name'].$eol;
$body .= 'Content-Transfer-Encoding: base64'.$eol;
$body .= 'Content-Disposition: attachment; filename='.$_FILES[$key]['name'].$eol;
$body .= $eol.chunk_split(base64_encode(file_get_contents($_FILES[$key]['tmp_name']))).$eol;
}
}
}
$body .= '--'.$boundary.'--'.$eol;
if ($mailto != '')
{
mail($mailto, $subject, $body, $header);
}
header('Location: '.$success_url);
exit;
}
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>form</title>
<link href="wwb-css/10.4.css" rel="stylesheet">
<link href="wwb-css/index.css" rel="stylesheet">
<script>
function Validateформа1(theForm)
{
var regexp;
regexp = /^[a-z,A-Z,а-я,А-Я]*$/;
if (!regexp.test(theForm.indexEditbox1.value))
{
alert("Please enter only letter characters in the \"Имя\" field.");
theForm.indexEditbox1.focus();
return false;
}
regexp = /^([0-9a-z]([-.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,6})$/i;
if (theForm.indexEditbox2.value.length != 0 && !regexp.test(theForm.indexEditbox2.value))
{
alert("Мыло не ввел");
theForm.indexEditbox2.focus();
return false;
}
return true;
}
</script>
</head>
<body>
<div id="container">
<div id="wb_indexForm1" style="position:absolute;left:361px;top:16px;width:249px;height:277px;z-index:4;">
<form name="форма1" method="post" action="<?php echo basename(__FILE__); ?>" enctype="multipart/form-data" accept-charset="UTF-8" id="indexForm1" onsubmit="return Validateформа1(this)">
<input type="hidden" name="formid" value="indexform1">
<input type="text" id="indexEditbox1" style="position:absolute;left:58px;top:23px;width:130px;height:26px;line-height:26px;z-index:0;" name="Имя" value="" placeholder="Введите имя">
<textarea name="Сообщение" id="indexTextArea1" style="position:absolute;left:26px;top:140px;width:195px;height:57px;z-index:1;" rows="2" cols="29" placeholder="Пишем тут"></textarea>
<input type="submit" id="indexButton1" name="" value="Отправить" style="position:absolute;left:76px;top:225px;width:96px;height:25px;z-index:2;">
<input type="email" id="indexEditbox2" style="position:absolute;left:58px;top:77px;width:122px;height:18px;line-height:18px;z-index:3;" name="Мыло" value="" placeholder="Введите мыло">
</form>
</div>
</div>
</body>
</html>
P.S.
Кстати,на локалке "Open Server" все работает без проблем.
Ниче не понимаю.
Последний раз редактировалось Spirit_on, 09.04.2016 в 14:46.
|
|
09.04.2016, 15:07
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
\w - это как раз 0-9a-z и _, зависит от локализации.
https://habrahabr.ru/post/175375/
https://habrahabr.ru/post/55820/
$eol = "\n"; - PHP_EOL
<?php echo basename(__FILE__); ?> - и какой в этом смысл? Это равноценно не указывать форме action, ибо по умолчанию оно и будет равно текущему адресу.
Если на локальном работает, а на удаленном нет, то смотреть логи.
|
|
09.04.2016, 15:47
|
|
Аспирант
|
|
Регистрация: 27.04.2014
Сообщений: 41
|
|
А можно чуть подробней про PHP_EOL
Я его вот так вставил:
Приходить стало,но криво:
Может не так и не туда поставил PHP_EOL
|
|
09.04.2016, 16:11
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
PHP_EOL - это предопределенная в РНР константа равная в зависимости от платформы либо \n, либо \r\n, ... То есть вместо $eol используйте PHP_EOL.
А если говорить об оформлении почтовом, то не мешало бы прочесть рекомендации RFC. Да и код у вас по структуре не ахти, ну например, начинается с оформления заголовков почты, а потом опомнившись проверяется мыло и бах, вывалились, спрашивается а зачем тогда заголовки? Сперва проверяются условия, аж уж затем при их соблюдении оформление и отправка почты.
И не понятно откуда появляются файлы, при отсутствии поля выбора в форме.
|
|
09.04.2016, 21:01
|
|
Аспирант
|
|
Регистрация: 27.04.2014
Сообщений: 41
|
|
|
|
09.04.2016, 21:55
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Это не левак, а тело сообщения почтового, то бишь что ему указано, так он и упаковывает. В качестве boundary упаковывать адрес, ну это надо иметь богатую фантазию, и учтите, что сообщение multipart, это несколько частей, и у каждой свой разделитель, да и части могут быть alternative, related.
Если вложенные файлы и файлы это изображения, и они отображаемые в письме (для режима offline), то для html формата выбирают Content-Transfer-Encoding: base64 разбитый на фиксированные строки.
Поставил \r вместо \n ... ну это просто глупость. Переносы на новую строку, это не для экспериментов, а для почтового отправления, дабы почтовые программы могли отличить в его теле мух от котлет, и не после каждой строки заголовка, разделителей, частей должен быть один перенос. И разделитель должен использоваться платформы, на которой работает сервер, поэтому и используйте PHP_EOL, и не майтесь...
Читайте рекомендации RFC по поводу оформления почтовых сообщений. Не хотите, ищите в сети об отправке почты и читайте как это грамотно и корректно делается. Не хотите и этого знать, берите готовый класс отправления почты, тот же phpmailer.
PS. Open Server реально ничего не отправляет, в нем sendmail работает как заглушка, а значит никто не принимает и ошибок вроде бы нет.
В приложении есть примеры тела почтовых отправлений для различных отправлений, это для раздумий. Все остальное искать и изучать, а написано об этом много, пересказывать все и не охота, и нет на это времени.
Последний раз редактировалось laimas, 17.11.2018 в 16:51.
|
|
|
|