@Web-Building

Использую PHPMailer. Почему ( $mail->addAttachment ) прикрепляет 2 одинаковых файла вместо разных??

Прикрепляю в письме, допустим 3 разных файла...., а приходят 2 одинаковых! Видимо 3-й файл "затирает" первые 2. Но почему тогда он приходит только в 2-х копиях, а не трёх?
Как советуют многие, если написать стандартно, если используешь PHPMailer - не спасает!
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name


Или что-то типа:
$mail->addAttachment($_FILES['attachfile'][0]['tmp_name'], $_FILES['attachfile']['name']);
$mail->addAttachment($_FILES['attachfile'][1]['tmp_name'], $_FILES['attachfile']['name']);

- абсолютно не помогает! Это тоже совсем не то, т.к. приходит только тело (текст), письма, без прикреплённых файлов! Приходит только сообщение в письме, без каких-либо прикреплённых файлов. Помогите пожалуйста разобраться! Как прикреплять несколько файлов с разным (со всеми) расширениями, например: JPG, JPEG, PNG, GIF, txt, WEBP, docx, BMP, video...

Вот нужные строки из HTML-формы:

<form action="mysite.com/submit.php" method="POST" id="modalForm" name="feedback_form" class="contact_form" enctype="multipart/form-data">
    <input type="email" name="user_email" placeholder="raid-gir@example.com" required id="email" />
    <input type="file" id="file" name="attachfile[]" value="1" class="upload_files" multiple="multiple" />
    <button type="submit" id="btnSend" name="sendMail" class="submit">Submit Form</button>
</form>


Обработчик HTML-формы, submit.php

use PHPMailer\PHPMailer\PHPMailer;   // создайте класс PHPMailer
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception; 
        
require_once "/home/homexnmx/public_html/vendor/autoload.php";
        
$email = $_POST['user_email'] = htmlspecialchars(stripslashes($_POST['user_email'])); 
         
$mail = new PHPMailer;  // по умолчанию используется php "mail()"
        
$mail->CharSet = 'UTF-8';
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = "smtp.yandex.ru";
$mail->SMTPAuth = true;
$mail->Username = "отпарвитель@yandex.ru";  // Имя пользователя и пароль
$mail->Password = "*****";
$mail->SMTPSecure = "ssl";
$mail->Port = 465;
$mail->From = "отправитель@yandex.ru";
$mail->FromName = "имя отправителя";
$mail->addAddress('получатель@mysite.com', 'Homexnmx');  // Имя получателя
$mail->isHTML(true);
$mail->Subject = 'Из модальной формы - adaptive.php';
        
$message = "<b>Email:</b>&emsp;$email<br>";  
                   
$mail->Body = $message;
   
//  Прикрепляются 2 одинаковых файла! Т.е. видимо 2-й затирает 1-й. 
if (!empty($_FILES['attachfile']['name'][0]))
{
    $target_file = count($_FILES['attachfile']['name']);  // $tempFiles
    for ($i = 0; $i < $target_file; $i++) { // получаем количество файлов с массива  // $tempFiles
        if ($_FILES['attachfile']['error'][$i] == 0) { // нет ошибки при передаче файла - продолжаем!
            if (!$mail->AddAttachment($_FILES['attachfile']['tmp_name'][$i], $_FILES['attachfile']['name'][$i], 'base64', $_FILES['attachfile']['type'][$i])) die($mail->ErrorInfo);
        }    $filename = "./uploads/". $_FILES['attachfile']["name"]; 
                   $mail->addAttachment($_FILES['attachfile']['tmp_name'], $_FILES['attachfile']['name']);

        // $mail->addAttachment($_FILES['attachfile'][0]['tmp_name'], $_FILES['attachfile']['name']);
        // $mail->addAttachment($_FILES['attachfile'][1]['tmp_name'], $_FILES['attachfile']['name']);

        // $mail->addAttachment($_FILES['attachfile'][0]['tmp_name'], $_FILES['attachfile'][0]['name']);
        // $mail->addAttachment($_FILES['attachfile'][1]['tmp_name'], $_FILES['attachfile'][1]['name']);

        //  $mail->addAttachment($_FILES['attachfile'][0]['tmp_name']);          
        //  $mail->addAttachment($_FILES['attachfile'][0]['name'], 'new.jpg');
    }
}

if (!$mail->send()) {
    echo $resalt = 'Message could not be sent!';      // Сообщение не может быть отправлено!
}


            else
{
    echo $resalt = '✅ <b>Message has been sent!</b><br><br><pre><b><a href="https://mysite.com/aptive.php" style="text-decoration:none;">⬅ Back to page</a></b></pre>';
} 
            
$mail->clearAddresses();  // очищаем список адресатов 
$mail->clearAttachments();  // очищаем файлы вложений


И последнее, это Ajax - adaptive.js

$(document).ready(function() {
        $('#modalForm').submit(function(e) {
        e.preventDefault();
        var resalt = document.querySelector('.resalt');
        var data = new FormData(jQuery('form')[0]);
        jQuery.each(jQuery('#file')[0].files, function(i, name) {
            data.append('attachfile[]', name);
        });

        jQuery.ajax({
        url: 'https://mysite.com/submit.php',
                data: data,
                cache: false,
                contentType: false,  // запретит jQuery устанавливать заголовок Content-Type и оставит это действие объекту XMLHttpRequest
                processData: false,  // предотвратит автоматическое преобразование данных FormData в строку запроса
                method: 'POST',
                type: 'POST', // For jQuery < 1.9
    
                success: function(data) {
                resalt = '✅<b>JS Your message sent!</b>';
    
                    $('.block-popup').hide('');
                    $('.note').css('display', 'block');
                    $('.resalt').html(data);
            },
    
                error: function(jqXHR, exception) {
                resalt = 'Mailer Error';
    
                    $('.block-popup').hide('');
                    $('.note').css('display', 'block');
                    $('.resalt').html(data);
            }
        });
    });
});
  • Вопрос задан
  • 744 просмотра
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Во-первых, вы повторно добавляете файлы при отправке формы. Этот код:
jQuery.each(jQuery('#file')[0].files, function(i, name) {
            data.append('attachfile[]', name);
        });

вообще не нужен, файлы уже есть в data.

Во-вторых, покажите нормальный код на PHP, и что именно он присылает. Ваш код не может работать из-за этого:
}    $filename = "./uploads/". $_FILES['attachfile']["name"]; 
                   $mail->addAttachment($_FILES['attachfile']['tmp_name'], $_FILES['attachfile']['name']);

(видимо, какие-то артефакты предыдущих попыток).

Без этого, код в целом выглядит рабочим. Выведите в лог (или прямо в браузер) массив $_FILES или $mail->getAttachments(), и посмотрите, все ли правильно аттачится.
Ответ написан
Ваш ответ на вопрос

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

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