Как прикрепить несколько файлов к двум разным электронным письмам с помощью PHPMailer? - PullRequest
0 голосов
/ 20 апреля 2019

Я использую PHPMailer для отправки двух разных писем двум разным получателям. Я хочу прикрепить несколько файлов, которые пользователь загрузил к обоим электронным письмам.

Теперь вложение нескольких файлов отлично работает для первой почты, но не для второй.

С моим текущим кодом файлы прикрепляются только к первому письму, но ни ко второму не прикрепляются:

// First e-mail to recipient 1

    $mail = new PHPMailer;
    $mail->setFrom('example@example.com');
    $mail->addAddress('recipient1@example.com');
    $mail->Subject = 'Subject';
    $mail->isHTML(true);
    $mail->Body = '...';

    // Attach multiple files one by one
    for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
        $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_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->send(); // I only wrote this once because as it turns out, it sends both of the mails



// Second e-mail to recipient 2

    $mail = new PHPMailer;
    $mail->setFrom('example@example.com');
    $mail->addAddress('recipient2@example.com');
    $mail->Subject = 'Subject';
    $mail->isHTML(true);
    $mail->Body = '...';


    // Attach multiple files one by one
    for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
        $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_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->addAttachment($uploadfile, $filename); 

на второе письмо. Это, однако, добавляет только первый указанный файл, а дублирование этой строки приводит к тому, что один и тот же файл отправляется дважды.

Есть идеи, как прикрепить несколько файлов (3 в моем случае) к двум разным электронным письмам?

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Я решил проблему следующим образом:

// First e-mail to recipient 1

    $mail = new PHPMailer;
    $mail->setFrom('example@example.com');
    $mail->addAddress('recipient1@example.com');
    $mail->Subject = 'Subject';
    $mail->isHTML(true);
    $mail->Body = '...';

    // Attach multiple files one by one
    for ($ct = 0; $ct < count($_FILES['userfile']['tmp_name']); $ct++) {
        $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_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;
        }
    }


// Altered e-mail to recipient 2

    $mail->ClearAddresses(); // avoid recipient 1 getting this altered mail
    $mail->addAddress('recipient2@example.com');
    $mail->Subject = 'New subject overwriting the first one';
    $mail->Body = 'New body overwriting the first one';


    $mail->send(); // send both mails

При этом одна и та же почта в основном отправляется дважды, включая вложения, но с некоторыми изменениями, вносимыми перезаписью e. г. предмет и тело.

0 голосов
/ 20 апреля 2019

Вы переместили загруженные файлы из временного хранилища при отправке вашей первой почты, и поэтому их больше нет со второй попытки.

move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)

Сначала необходимо переместить загруженный файл, а затемиспользуйте переменную $uploadfile дважды.

Вы действительно должны поместить все это в одну функцию, чтобы вы также не повторяли себя.

...