W
W
Wyfer2020-11-10 10:13:22
PHP
Wyfer, 2020-11-10 10:13:22

Why is the attachment file not being sent via SMTP?

Good day to all! For some reason, it is impossible to achieve that the File would come to the mail via SMTP with an attachment. The text comes through but the file doesn't.
An application form to be filled out on the website.

<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>


Next goes to the contacts1.php file

<?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 which sends

<?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;
}
?>

Answer the question

In order to leave comments, you need to log in

2 answer(s)
G
galaxy, 2020-11-10
@galaxy

In contacts1.php, it's just that some kind of feat is written: $headers is not used at all, attachments (which should be collected in a MIME message) are in fact simply molded into the text of the letter in base64...
Throw it all away to hell. Take, as advised in the comments, PHPMailer and do the same as the example with sending files.

N
Nadim Zakirov, 2020-11-10
@zkrvndm

I recommend using this library for sending letters:
https://vk-book.ru/novaya-versiya-klassa-sendmails...
It is very easy to use, and you can add files in one line:

// добавляем файлы
$mailSMTP->addFile("test.jpg");
$mailSMTP->addFile("test2.jpg");
$mailSMTP->addFile("test3.txt");

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question