@Wyfer

Почему не отправляется файл прикрепления через SMTP?

Всем доброго времени суток! Почему то не получается добиться того что бы Файл приходил на почту через SMTP с вложением. Текст доходит а файл нет.
Форма обращения которую заполняют на сайте.
<h2> </h2>
<table>
<span style="font-size: 18px;"><b><p>Электронное обращение для граждан</p></b></span>

<p>Если вы хотите получить ответы на интересующие Вас вопросы, заполните эту форму. Мы свяжемся с вами в ближайшее время.</p>
<p><b>Пожалуйста, заполните все обязательные поля:</p></b>
<tr>
<td><form method="POST" action="<b>домен сайта</b>/contacts1.php" name="contactFF" enctype="multipart/form-data">
<div id="form1">
<div class="inp">
<b><p>Фамилия, имя, отчество (если таковое имеется) / Прозвiшча, iмя, iмя па-бацьку :</p></b>
<input class="inp-f" type="text" name="nameFF" value="" /> 
<div class="error"> </div>
</div>
<div class="inp">
<b><p>Ваш E-mail:</p></b>
<input class="inp-f" type="text" name="mailFF" value="" /> 
<div class="error"> </div>
</div>
<div class="inp">
<b><p>Адрес места жительства (места пребывания) / Адрас месца жыхарства (месца знаходжання):</p></b>
<input class="inp-f" type="text" name="addressFF" value="" /> 
<div class="error"> </div>
</div>
<b><p>Cообщение / Паведамленне:</p>
<div class="inp"><textarea style="margin: 0px; width: 421px; height: 185px;" name="messFF"></textarea> 
<div class="error"> </div>
</div>
<b><p>Дополнительные документы и (или) сведения /Дадатковыя дакументы і (або) звесткі:</p></b>
<div class="inp"><input id="file" type="file" name="fileFF" size="100000000" /></div>
</div>
<div class="inp"><br /><input class="btn" title="Отправить" type="submit" value="ОТПРАВИТЬ" /></div>
<p> </p>
</form></td>
</tr>
</tbody>
</table>
<script>
document.getElementById('form1-form').addEventListener('submit', function(evt){
  var http = new XMLHttpRequest(), f = this;
  evt.preventDefault();
  http.open("POST", "contacts1.php", true);
  http.onreadystatechange = function() {
    if (http.readyState == 4 && http.status == 200) {
      alert(http.responseText);
      f.messageFF.removeAttribute('value'); // очистить поле сообщения
      f.messageFF.value=''; // очистить поле сообщения
    }
  }
  http.onerror = function() {
    alert('Извините, данные не были переданы');
  }
  http.send(new FormData(f));
}, false);
</script>


Дальше идёт в файл contacts1.php

<?php
include_once "mail.php";

  $to = "<b>почта на которую должен отправить</b>"; 
  $from = $_POST['contactFF'];
  $subject = "Заполнена контактная форма"; // с ".$_SERVER['HTTP_REFERER'];
  $message = "<br /> <b>Имя: </b> ".$_POST['nameFF']."<br /><b>Адрес: </b>".$_POST['addressFF']."<br /><b>Email: </b>".$_POST['mailFF']."<br /><b>Сообщение: </b><br /><i><font size=\"4\" color = \"blue\">".$_POST['messFF']."</font></i>";
  $boundary = md5(date('r', time()));
  $filesize = '';
  $headers = "MIME-Version: 1.0\r\n";
  $headers .= "From: " . $from . "\r\n";
  $headers .= "Reply-To: " . $from . "\r\n";
  $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";

  for($i=0;$i<count($_FILES['fileFF']['name']);$i++) {
     if(is_uploaded_file($_FILES['fileFF']['tmp_name'][$i])) {
         $attachment = chunk_split(base64_encode(file_get_contents($_FILES['fileFF']['tmp_name'][$i])));
         $filename = $_FILES['fileFF']['name'][$i];
         $filetype = $_FILES['fileFF']['type'][$i];
         $filesize += $_FILES['fileFF']['size'][$i];
         $message.="<br /><b>Вложенные файлы: </b>".$attachment;
     }
   }

  if ($filesize < 10000000) { // проверка на общий размер всех файлов. Многие почтовые сервисы не принимают вложения больше 10 МБ
    	smtpmail("", $to, $subject, $message, "");
	//mail($to, $subject, $message, $headers);
    echo $_POST['nameFF'].', Ваше сообщение успешно отправлено, спасибо! С вами скоро свяжутся!';
  } else {
    echo 'Извините, письмо не отправлено. Размер всех файлов превышает 10 МБ.';
  }
?>


mail.php который отправляет

<?php
$config['smtp_username'] = 'почта@yandex.by';  //Смените на адрес своего почтового ящика.
$config['smtp_port'] = '465'; // Порт работы.
$config['smtp_host'] =  'ssl://smtp.yandex.ru';  //сервер для отправки почты
$config['smtp_password'] = 'пароль для приложений';  //Измените пароль
$config['smtp_debug'] = true;  //Если Вы хотите видеть сообщения ошибок, укажите true вместо false
$config['smtp_charset'] = 'utf-8';	//кодировка сообщений. (windows-1251 или utf-8, итд)
$config['smtp_from'] = 'Название нашей организации'; //Ваше имя - или имя Вашего сайта. Будет показывать при прочтении в поле "От кого"
	
function smtpmail($to='', $mail_to, $subject, $message, $headers='') {
	global $config;
	$SEND =	"Date: ".date("D, d M Y H:i:s") . " UT\r\n";
	$SEND .= 'Subject: =?'.$config['smtp_charset'].'?B?'.base64_encode($subject)."=?=\r\n";
	if ($headers) $SEND .= $headers."\r\n\r\n";
	else
	{
			$SEND .= "Reply-To: ".$config['smtp_username']."\r\n";
			$SEND .= "To: \"=?".$config['smtp_charset']."?B?".base64_encode($to)."=?=\" <$mail_to>\r\n";
			$SEND .= "MIME-Version: 1.0\r\n";
			$SEND .= "Content-Type: text/html; charset=\"".$config['smtp_charset']."\"\r\n";
			$SEND .= "Content-Transfer-Encoding: 8bit\r\n";
			$SEND .= "From: \"=?".$config['smtp_charset']."?B?".base64_encode($config['smtp_from'])."=?=\" <".$config['smtp_username'].">\r\n";
			$SEND .= "X-Priority: 3\r\n\r\n";
	}
	$SEND .=  $message."\r\n";
	 if( !$socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 10000000) ) {
		if ($config['smtp_debug']) echo $errno."<br>".$errstr;
		return false;
	 }
 
	if (!server_parse($socket, "220", __LINE__)) return false;
 
	fputs($socket, "HELO " . $config['smtp_host'] . "\r\n");
	if (!server_parse($socket, "250", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не могу отправить HELO!</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, "AUTH LOGIN\r\n");
	if (!server_parse($socket, "334", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не могу найти ответ на запрос авторизаци.</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, base64_encode($config['smtp_username']) . "\r\n");
	if (!server_parse($socket, "334", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Логин авторизации не был принят сервером!</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, base64_encode($config['smtp_password']) . "\r\n");
	if (!server_parse($socket, "235", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, "MAIL FROM: <".$config['smtp_username'].">\r\n");
	if (!server_parse($socket, "250", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не могу отправить комманду MAIL FROM: </p>';
		fclose($socket);
		return false;
	}
	fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");
 
	if (!server_parse($socket, "250", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не могу отправить комманду RCPT TO: </p>';
		fclose($socket);
		return false;
	}
	fputs($socket, "DATA\r\n");
 
	if (!server_parse($socket, "354", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не могу отправить комманду DATA</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, $SEND."\r\n.\r\n");
 
	if (!server_parse($socket, "250", __LINE__)) {
		if ($config['smtp_debug']) echo '<p>Не смог отправить тело письма. Письмо не было отправленно!</p>';
		fclose($socket);
		return false;
	}
	fputs($socket, "QUIT\r\n");
	fclose($socket);
	return TRUE;
}

function server_parse($socket, $response, $line = __LINE__) {
	global $config;
	while (@substr($server_response, 3, 1) != ' ') {
		if (!($server_response = fgets($socket, 256))) {
			if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
 			return false;
 		}
	}
	if (!(substr($server_response, 0, 3) == $response)) {
		if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
		return false;
	}
	return true;
}
?>
  • Вопрос задан
  • 685 просмотров
Пригласить эксперта
Ответы на вопрос 2
@galaxy
В contacts1.php просто кал какой-то написан: $headers не используется вообще, вложения (которые должны собираться в MIME-сообщение) по факту просто лепятся в текст письма в base64...

Выкиньте это все к чертовой матери. Возьмите, как советовали в комментах, PHPMailer и сделайте аналогично примеру с отправкой файлов.
Ответ написан
zkrvndm
@zkrvndm
Архитектор решений
Рекомендую использовать для отправки писем эту библиотеку:
https://vk-book.ru/novaya-versiya-klassa-sendmails...
Она очень проста в использовании, а добавлять файлы можно в одну строку:
// добавляем файлы
$mailSMTP->addFile("test.jpg");
$mailSMTP->addFile("test2.jpg");
$mailSMTP->addFile("test3.txt");
Ответ написан
Ваш ответ на вопрос

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

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