Форма обратной связи SMTP на PHPMailer с прикреплением файлов — почему не приходят вложения на почту?

Всем добрый день!
Имеется форма обратной связи c отправкой по SMTP при помощи библиотеки PHPMailer.
Открывается в модальном окне и работает без перезагрузки страницы.

Форма HTML имеет вид:
<form action="letter.php" method="post" id="contact" enctype="multipart/form-data">

<label for="name">Имя:</label>
<input type="text" name="name" id="name" placeholder="Введите имя" required>

<label for="nomer">Телефон:</label>
<input type="text" name="nomer" id="nomer" placeholder="Ваш телефон" required>

<label for="email">Email:</label>
<input type="text" name="email" id="email" placeholder="Ваш e-mail" required>

<label for="body">Сообщение:</label>
<textarea name="body" id="body" placeholder="Наберите сообщение" required></textarea>

<label for='userfile[]'>Выберите файл:</label>
<input type="file" name="userfile[]" id="userfile" multiple>

<label for="check"><input type="checkbox" id="check">...</label>

<input type="hidden" name="validac" class="validac" value="validac_disabled">
<input id="submit" type="submit" name="submit" value="Отправить" disabled>

</form>


Обработчик php - letter.php :
<?php

if( $_POST){

	require 'phpmailer.php';
	require 'smtp.php';
	
$mail = new PHPMailer;
$mail->isSMTP();

// Настройки
	$mail->Host = 'smtp.server.ru';
	$mail->SMTPAuth = true;
	$mail->CharSet = 'UTF-8';
	$mail->Username = 'info@domain.ru'; // логин от вашей почты
	$mail->Password = 'Password'; // пароль от почтового ящика
	$mail->SMTPSecure = 'ssl';
	$mail->Port = '465';
	$mail->From = 'info@domain.ru'; // адрес почты, с которой идет отправка
	$mail->FromName = 'Сообщение с domain.ru'; // имя отправителя
	$mail->addAddress('info@domain.ru');
 
 // Прикрепление файлов
  for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
        $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['userfile']['name'][$ct]));
        $filename = $_FILES['userfile']['name'][$ct];
        if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
            $mail->addAttachment($uploadfile, $filename);
        } else {
            $msg .= 'Failed to move file to ' . $uploadfile;
        }
    }
 
// Письмо
$mail->isHTML(true);
$mail->Body = "Имя: {$_POST['name']}<br> Телефон: {$_POST['nomer']}<br> Email: {$_POST['email']}<br> Сообщение: " . nl2br($_POST['body']);
$mail->AltBody = "Имя: {$_POST['name']}\r\n Телефон: {$_POST['nomer']}\r\n Email: {$_POST['email']}\r\n Сообщение: {$_POST['body']}";
//	$mail->SMTPDebug = 0;

	if( $mail->send() ){
		$answer = '1';
	}else{
		$answer = '0';
		echo 'Письмо не может быть отправлено. ';
		echo 'Ошибка: ' . $mail->ErrorInfo;
	}
	die( $answer );
}

?>


Затем прикрепляю библиотеку jquery-3.2.1.min, и приписываю скрипт Аякса для отправки формы без перезагрузки страницы:
/*message*/
$(function(){
	$('#contact').submit(function(){
		var errors = false;
		$(this).find('span').empty();
		$(this).find('input, textarea').each(function(){
			if( $.trim( $(this).val() ) == '' ) {
				errors = true;
				$(this).next().text( 'Не заполнено поле ' + $(this).prev().text() );
			}
		});
		if( !errors ){
			var data = $('#contact').serialize();
			$.ajax({
				url: 'letter.php',
				type: 'POST',
				data: data,
				beforeSend: function(){
					$('#submit').next().text('Отправляю...');
				},
				success: function(res){
					if( res == 1 ){
						$('#contact').find('input:not(#submit), textarea').val('');
						$('#submit').next().empty();
						alert('Письмо отправлено');
					}else{
						$('#submit').next().empty();
						alert('Ошибка отправки');
					}
				},
				error: function(){
					alert('Ошибка!');
				}
			});
		}
		return false;
	});
});


Проблема в том, что письма приходят без вложения.
Не знаю как правильно реализовать, чтобы работала отправка файлов на почту. И желательно вложения нескольких файлов к письму с валидацией (ограничения по размеру и расширению файлов)

Как должен выглядеть правильный код?
  • Вопрос задан
  • 3217 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
декомпозируй

добейся прихода локального файла

потом добейся сохранения локально заапрлоаженого

потом соедини
Ответ написан
Ваш ответ на вопрос

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

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