Всем добрый день!
Имеется
форма обратной связи 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;
});
});
Проблема в том, что письма приходят без вложения.
Не знаю как правильно реализовать, чтобы работала отправка файлов на почту. И желательно вложения нескольких файлов к письму с валидацией (ограничения по размеру и расширению файлов)
Как должен выглядеть правильный код?