PHPMailer, использующий AddStringAttachment с помощью addAttachment

#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. я думаю, это может быть связано с тем, что вы используете привязку строк, $pdf в двоичном формате или в формате base64? обратите внимание, что AddStringAttachment поддержка двоичного формата возможна только в том случае, если вы $pdf закодированы в base64, вам сначала потребуется base64_decode() это

3. $pdf генерируется из DomPdf $pdf = $dompdf-gt;output(); простой строки

4. Такой вещи, как строка, не существует, строка-это просто управляемый массив символов, а символы-это просто int8, поэтому любые двоичные данные могут отображаться в виде строки, но да, вы используете Dompdf — gt;output (), тогда да, вывод двоичный.