2.5 Отправка письма
Теперь опишу работу модуля для отправки формы. Это файл form.php. По традиции он начинается с защиты от прямого доступа к файлу. if ( substr(__FILE__, strrpos(__FILE__, "/")) == substr($_SERVER['SCRIPT_NAME'], strrpos($_SERVER['SCRIPT_NAME'], "/")) ) { header("HTTP/1.0 404 Not Found"); echo "ERROR 404"; exit(); } Затем проверяется условие, которое говорит о том, что открыта страница с формой. if (isset($_GET['code']) && isset($_GET['id'])){ Затем идет генерация формы. В данной системе генерация представляет собой заполнение глобального массива и выдача в зарезервированные участки. Таким образом браузер получит html код с характерной для конкретной страницы формой. Например, для страницы «лестницы винтовые» заполнение массива происходит так: switch ($_REQUEST['id']){ case 1: $args['FORM']['desc'] = "Размеры лестничного проема"; $args['FORM']['I1']['text'] = "длина, м: "; $args['FORM']['I2']['text'] = "ширина, м: "; $args['FORM']['I3']['text'] = "высота от пола до пола, м: "; $args['FORM']['SELECT']['select_desc'] = "Ступени и деревянные элементы из: "; $args['FORM']['SELECT']['name'] = "tree"; $args['FORM']['SELECT']['OPTION'][]['text'] = "бук"; $args['FORM']['SELECT']['OPTION'][]['text'] = "дуб"; $args['FORM']['SELECT']['OPTION'][]['text'] = "ясень"; $args['FORM']['SELECT']['OPTION'][]['text'] = "орех"; $args['FORM']['SELECT']['OPTION'][]['text'] = "береза"; $args['FORM']['SELECT']['OPTION'][]['text'] = "другое"; break; После заполнения, остальные операторы пропустятся ибо они установлены по «else». Управление переходит в низ страницы, где происходит вывод шаблона и подстановка переменных. echo file_get_contents(dirname(__FILE__)."/form.htm"); после первого if следует elseif (!isset($_REQUEST['code'])){ Говорит о том, что если мы просматриваем страницу, но которой выводится список фотографий. Проверяем какая страница открыта: switch ($pc->Tree['id']){ case 17: $args['type'] .= 'Лестницы винтовые'; $id = 1; break; case 22: $args['type'] .= 'Лестницы маршевые'; $id = 5; break; … } В зависимости от того, какая страница запрошена, считываем содержимое определенной папки. Выбираем из неё все фотографии. $list = glob("./images/".$id."/*.jpg"); $count = count($list); Затем следует код для впервые загруженных фотографий, чтобы проставить им приоритет. Приоритет – это префикс к имени файла: число_имя_файла. Фотографии выводятся на странице согласно приоритету. Чем меньше число, тем выше приоритет. for ($z = 0; $z < $count; $z++){ if (!preg_match('/ ^\d+ _ \w+ /x', basename($list[$z], '.jpg'))){ rename($list[$z], dirname($list[$z]). '/'. $z. '_'. basename($list[$z])); } } Далее идет натуральная: natsort($list); $list = array_values($list); if (isset($_GET['onpage'])) { В переменной $onpage хранится количество выводимых на странице элементов. $onpage = $_GET['onpage']; В переменной $style хранится CSS-код для выделения активной страницы. $style = ''; switch ($onpage){ case 5: $args['ONPAGE']['act1'] = $style; break; case 10: $args['ONPAGE']['act2'] = $style; break; case 50: $args['ONPAGE']['act3'] = $style; break; default: $args['ONPAGE']['act2'] = $style; break; } Если $onpage не задан, то берется значение по умолчанию. }else { $onpage = 10; $args['ONPAGE']['act2'] = ''; } Затем вывод пэйджера (листалки) и вывод самих элементов. В переменной $pp хранится номер, начинаю с которого будут выведены элементы на странице. $pp = $page * $onpage; $count_page – всего страниц. $count_page = ceil(count($list)/$onpage); Помещаем в массив $args названия изображений и идентификатор страницы: for ($i = $pp; ($i < $count) && ($i < ($pp + $onpage)); $i++) $args['VIEW'][] = array('img' => basename($list[$i], '.jpg'), 'id' => $id); Если количество страниц больше одной, то выводим пэйджер. if ($count_page > 1) for ($k = 0; $k < ($count_page); $k++) { Если страница активна, т.е. открыта, то не делаем её ссылкой, а просто выделяем цветом. if ( (!isset($_GET['page']) && $k == 0) || (($k+1) == @$_GET['page']) ) $page_num = array('page'=>$k+1, 'NO_ACTIVE_1'=>array(),'NO_ACTIVE_2'=>array()); Если страница активна: else $page_num = array('page'=>$k+1, 'ACTIVE_1'=>array('page'=>$k+1,'onpage'=>$onpage),'ACTIVE_2'=>array()); $page_listArr['NUMBER'][$k] = $page_num; } $args['PAGE_LIST'] = $page_listArr; } Затем рассматривается третий вариант – когда форма отправлена: elseif ((trim(@$_POST['i4']) != "") && (trim($_POST['i5']) != "") && (trim($_POST['i7']) != "")){ Идет сборка необходимых переменных и проверка на «прикреплен ли файл»: if (!empty($_FILES['mail_file']['tmp_name'])){ Если файл прикреплен, то считываем его временное имя, проверяем, изображение ли это. $info = @getimagesize($_FILES['mail_file']['tmp_name']); if (preg_match('{image/(.*)}is', $info['mime'], $mas)){ $path = $_FILES['mail_file']['name']; Копируем файл на сервер: if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path; }else{ Если передан не файл, делаем переадресацию на страницу формы и выдаем сообщение, что письмо не отправлено. header("Location: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}?sendmsg=0"); exit(); } } И отправка письма: if(empty($picture)) echo (mail($mail_to, $thm, $msg))? "Сообщение отправлено" : "Сообщение отправить не удалось. Повторите попытку"; else{ if (send_mail($mail_to, $thm, $msg, $picture) == true) header("Location: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}?sendmsg=1"); Если письмо с вложением отправить не удалось, делаем переадресацию на страницу формы и выдаем сообщение, что письмо не отправлено: else header("Location: http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}?sendmsg=0"); exit(); } Функция для отправки письма с вложением. Принимает 4 параметра: кому отправить, тема письма, тело письма, путь к файлу. function send_mail($mail_to, $thema, $html, $path){ if ($path){ $fp = fopen($path,"rb"); if (!$fp){ print "Cannot open file"; exit(); } $file = fread($fp, filesize($path)); fclose($fp); } В этой переменной надо сформировать имя файла (без всякого пути) $name = "file.jpg"; Ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём: $EOL = "\r\n"; Любая строка, которой не будет ниже в потоке данных. $boundary = "--".md5(uniqid(time())); Установка загаловков письма: $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $headers .= "From: address@server.com"; $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=UTF-8$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; Раздел между заголовками и телом html-части: $multipart .= $EOL; $multipart .= chunk_split(base64_encode($html)); $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL"; Раздел между заголовками и телом прикрепленного файла $multipart .= $EOL; $multipart .= chunk_split(base64_encode($file)); $multipart .= "$EOL--$boundary--$EOL"; Отправка if(!mail($mail_to, $thema, $multipart, $headers)) return false; else return true; } |