#php #phpmailer
#php #phpmailer
Вопрос:
У меня есть форма, которая генерирует PDF-файл из пользовательских вводов, а также возможность загрузки файла.
Таким образом, пользователь может загружать файл или нет, и я использую AddAttachment
его для этой части и AddStringAttachment
для сгенерированного PDF-файла.
Вот мой код:
//PDF $pdf = $dompdf-gt;output(); //Configuration $mail = new PHPMailer; $mail-gt;IsSMTP(); $mail-gt;CharSet = 'UTF-8'; $mail-gt;Host = 'localhost'; $mail-gt;SMTPAuth = false; //Email details $mail-gt;From = 'email@email.com'; $mail-gt;FromName = 'My email'; $mail-gt;Subject = 'You have a new email'; $mail-gt;Body = 'Hi there, You have a new message.lt;brgt;'; $mail-gt;AltBody = 'Hi there, You have a new message.'; //Loop through recipients $recipients = ['email1@email.com', 'email2@email.com']; foreach ($recipients as $recipient) { $mail-gt;addAddress($recipient); $mail-gt;AddStringAttachment($pdf, 'name.pdf'); if (!empty($_FILES['upload']['tmp_path'])) { $mail-gt;AddAttachment($_FILES['upload']['tmp_path'], 'upload.pdf'); } if ( !$mail-gt;Send() ) { echo 'Not sent'; } else { echo 'Sent'; } // Clear all addresses and attachments for next loop $mail-gt;clearAddresses(); $mail-gt;clearAttachments(); }
Проблема в том, что когда я загружаю файл, я получаю 2 электронных письма: 1 — С вложением и сгенерированным PDF-файлом (который ожидается) 2 — Только с сгенерированным pdf-файлом. Но содержимое перепутано и выглядит неправильно.
Когда я не загружаю файл, я получаю только 1 электронное письмо.
Я попытался отправить только 1 электронное письмо, и это то же самое.
Комментарии:
1. Зачем вы вообще добавляете вложения в цикл?
2. @miken32, потому что вложения будут очищены в конце каждого цикла. Я не уверен, как работает эта часть
$mail-gt;clearAddresses(); $mail-gt;clearAttachments();
3. Но вы просто добавляете одни и те же вложения снова и снова.
4. Я этого не знал. Спасибо
5. В вашем вопросе отсутствует слишком много информации, чтобы быть уверенным, но, похоже, у вас несколько проблем. Я не знаю, пропустил ли я это раньше или вы обновили вопрос, но почему у вас есть addStringAttachment И addAttachment. У вас также есть по крайней мере 6 переменных, о которых мы понятия не имеем, что они могут содержать или не содержать ($получатели, $pdf, $имя файла, $путь, $отчет, $вложение).
Ответ №1:
Если это сработает, пожалуйста, не отмечайте это как ответ на Gview, я просто показал код и исправил проблему с ресурсами.
Хотя ответ Gview должен решить проблему, вам действительно не следует добавлять и удалять вложения внутри цикла
Это полная версия кода, использующая исправление, опубликованное gview, и не тратящая ресурсы процессора на ненужное прикрепление и удаление вложения PDF. как сказал микен32 в комментариях.
//Configuration $mail = new PHPMailer; $mail-gt;IsSMTP(); $mail-gt;CharSet = 'UTF-8'; $mail-gt;Host = 'localhost'; $mail-gt;SMTPAuth = false; //Email details $mail-gt;From = 'email@email.com'; $mail-gt;FromName = 'My email'; $mail-gt;Subject = 'You have a new email'; $mail-gt;Body = 'Hi there, You have a new message.lt;brgt;'; $mail-gt;AltBody = 'Hi there, You have a new message.'; //Loop through recipients $mail-gt;AddStringAttachment($pdf, $filename); if (!empty($attach)) { $mail-gt;AddAttachment($path, $report); } foreach ($recipients as $recipient) { $mail-gt;addAddress($recipient); if ( !$mail-gt;Send() ) { echo 'Not sent'; } else { echo 'Sent'; } // Clear all addresses and attachments for next loop $mail-gt;clearAllRecipients(); } $mail-gt;clearAttachments();
Комментарии:
1. Это не решило проблему. Я все еще получаю 2 письма
2. я думаю, это может быть связано с тем, что вы используете привязку строк,
AddStringAttachment
поддержка двоичного формата возможна только в том случае, если выbase64_decode()
это3.
DomPdf
$pdf = $dompdf-gt;output();
простой строки4. Такой вещи, как строка, не существует, строка-это просто управляемый массив символов, а символы-это просто int8, поэтому любые двоичные данные могут отображаться в виде строки, но да, вы используете Dompdf — gt;output (), тогда да, вывод двоичный.