baks090780
@baks090780
Верстальщик

Форма обратной связи, как сделать с вложением (прикреплением файлов)?

Всем добрый день и хорошего настроения!

Есть файл index.php, в нем форма:

<form action="send.php" enctype="multipart/form-data" method="post">
		<fieldset>
			<input type="text" name="name" value="" style="display:none;">
			<input type="text" name="fieldFormName" value="Вопрос" style="display:none;" readonly>
			<p>
				<label>Ваше имя:</label>
				<input type="text" name="fieldName" placeholder="Иван" required>
			</p>
			<p>
				<label>Ваш E-Mail:</label>
				<input type="email" name="fieldMail" placeholder="name@domain.ru" required>
			</p>
			<p>
				<label>Приложить файлы:</label>
				<input type="file" name="fieldFiles" multiple>
			</p>
			<p>
				<label>Текст:</label>
				<textarea name="fieldText" rows="5" placeholder="Текст" required></textarea>
			</p>
			<p>
				<button type="submit">Отправить отзыв</button>
			</p>
		</fieldset>
	</form>


А так же есть обработчик - send.php, в котором необходимо сделать с вложением файлом, есть необходимость сделать с валидацией на загрузку определенных расширений, например ".jpg", ".jpeg", ".png", ".gif", а так же ограничить максимальный размер файла, к примеру 3Мб.

// Узнаем IP Адрес пользователя
	function getIp() {
		$keys = [
			'HTTP_CLIENT_IP',
			'HTTP_X_FORWARDED_FOR',
			'REMOTE_ADDR'
		];
		foreach ($keys as $key) {
			if (!empty($_SERVER[$key])) {
				$ipUser = trim(end(explode(',', $_SERVER[$key])));
				if (filter_var($ipUser, FILTER_VALIDATE_IP)) {
					return $ipUser;
				}
			}
		}
	}
	$ipUser = getIp();

$siteName = 'MySite.RU'

	// Получаем данные из полей форм
	$fieldFormName = $_POST['fieldFormName'];
	$spam = $_POST['name'];
	$fieldName = $_POST['fieldName'];
	$mailUser = $_POST['fieldMail'];
	$fieldText = $_POST['fieldText'];

	// Оформление письма, которое придет получателю (и пользователю).
	if ($fieldFormName == 'Вопрос'): // Если форма с названием "Вопрос", то отправлять эти данные

		// Сообщение для меня
		$messageMe = '
		<h1>'.$fieldFormName.' с сайта "'.$siteName.'"</h1>
		IP адрес отправителя: '.$ipUser.'<br>
		Имя: '.$fieldName.'<br>
		Электронная почта: '.$mailUser.'<br>
		Текст: '.$fieldText.'
		';

		// Сообщение для пользователя
		$messageUser = '
		<h1>'.$fieldFormName.' с сайта "'.$siteName.'"</h1>
		IP адрес отправителя: '.$ipUser.'<br>
		Имя: '.$fieldName.'<br>
		Электронная почта: '.$mailUser.'<br>
		Текст: '.$fieldText.'
		';

		// Сообщение выводимое на сайте после успешной отправки
		$messageSent = '
		Имя: '.$fieldName.'<br>
		IP адрес отправителя: '.$ipUser.'<br>
		Электронная почта: '.$mailUser.'<br>
		Текст: '.$fieldText.'
		';

	elseif ($fieldFormName == 'Отзыв'): // Иначе если форма с названием "Отзыв", то отправлять эти данные

		// Сообщение для меня
		$messageMe = '';

		// Сообщение для пользователя
		$messageUser = '';

		// Сообщение выводимое на сайте после успешной отправки
		$messageSent = '';

	endif;

	// Определение СПАМа
	if (empty($spam)) {

		$mailTo= "username@mysite.ru"; // Кому отправляем форму
		$mailFrom = "no-replay@mysite.ru"; // От кого отправлена форма
		$subject = $fieldFormName.' с сайта "'.$siteName.'"'; // Тема письма (Пример: $subject = 'Сообщение с сайта';)

		// Заголовки, отвечающие за кодировку и тип письма, оставляем без изменений
		$headers = "From: $mailFrom\r\nReplay-To: $mailFrom\r\nContent-type: text/html; charset=utf-8\r\n";

		// Отправляем пользователю mail(кому отправляем, тема, текст в сообщении, заголовки)
		mail ( 
			$mailUser,
			$subject,
			$messageUser,
			$headers
		);
		// Отправляем себе mail(кому отправляем, тема, текст в сообщении, заголовки)
		$send = mail ( 
			$mailTo,
			$subject,
			$messageMe,
			$headers
		);

		// Если отправка прошла успешно, то загружаем шаблон сайта с содержимым, иначе ошибка
		if ($send == 'true') {
			include_once('sent.php');
		} else {
			echo 'Ой, ошибочка какая-то!';
		}

	} else {
		echo 'Ой, СПАМ какой-то!';
	}


Файл-шаблон результата sent.php

<p>
		<a href="#" onclick="javascript:history.back(); return false;">
			Назад
		</a>
	</p>
	<h1>
		Поздравляем!
	</h1>
	<p>
		Сообщение отправлено!
	</p>
	<p>
		<b>Содержание письма:</b>
	</p>
	<hr>
	<p>
		<?php echo $messageSent; ?>
	</p>


Народ, Помогите Пожалуйста с решением данного вопроса, я просто не особо силен в php, иначе уже сам сделал бы.

Заранее Благодарю за помощь и ответ!
  • Вопрос задан
  • 727 просмотров
Решения вопроса 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
$text = 'Message text'; // Текст сообщения

$subject = 'Message subject'; // Тема письма

$email = 'test@mail.ru'; // Адрес электронной почты

$body = '';

// Забираем имя файла и содержимое из файлового поля формы 
$fileName = $_FILES['file']['name'];
$fileStream = file_get_contents($_FILES['file']['tmp_name']);

// Специальный сепаратор письма, разделитель частей
$bound = '_=_Multipart_Boundary_' . substr(md5(uniqid('', true)), 0, 8);

// Заголовок письма
$header = 'Content-Type: multipart/mixed; boundary="' . $bound . '"' . PHP_EOL . 'X-Mailer: PHP' . PHP_EOL . 'Reply-To: No reply' . PHP_EOL;

// Секция текстовой части
$body .= '--' . $bound . PHP_EOL .
    'Content-Type: text/plain; charset="UTF-8"' . PHP_EOL .
    'Content-Disposition: inline' . PHP_EOL .
    'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL .
    chunk_split(base64_encode($text)) . PHP_EOL;

// Секция файловой части
$body .= PHP_EOL . '--' . $bound . PHP_EOL .
    'Content-Type: application/octet-stream; name="' . $fileName . '"' . PHP_EOL .
    'Content-Disposition: attachment;' . PHP_EOL .
    ' filename="' . $fileName . '"' . PHP_EOL .
    'Content-Transfer-Encoding: base64' . PHP_EOL . PHP_EOL . chunk_split(base64_encode($fileStream));

// Конец 
$body .= '--' . $bound . '--';

mail(
    $email,
    '=?UTF-8?B?' . base64_encode($subject) . '?=',
    $body,
    'MIME-Version: 1.0' . PHP_EOL . $header
);


Сама суть, для прикрепления нескольких файлов нужно некоторый код вынести в цикл, вряд ли вам код поможет понять
поняно ответили, особенно для человека, который в php далекий
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы