Форма обратной связи 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;
	});
});


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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы