Как добавить несколько вложений в электронное письмо с помощью PHPMailer - PullRequest
0 голосов
/ 05 августа 2020

Мне удавалось прикрепить к письму только один PDF-файл за раз. Может ли кто-нибудь помочь мне понять, как добавить несколько вложений в электронную почту с помощью PHPMailer? Сначала я попытался просто использовать несколько операторов добавления вложений, следующих друг за другом.

$file1Name = $_FILES['myfile1']['name'];
$file1Path = $_FILES['myfile1']['tmp_name'];
$file2Name = $_FILES['myfile2']['name'];
$file2Path = $_FILES['myfile2']['tmp_name'];
$file3Name = $_FILES['myfile3']['name'];
$file3Path = $_FILES['myfile3']['tmp_name'];
$mail = new PHPMailer;
$mail->IsSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->Port = '587';
$mail->SMTPAuth = true;
$mail->Username = 'email@gmail.com';
$mail->Password = 'password';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
// . . .
$mail->Body = $mail_body;
$mail->addAttachment($file1Path, $file1Name);
$mail->addAttachment($file2Path, $file2Name);
$mail->addAttachment($file3Path, $file3Name);
$mail->Send();

Это не сработало. Посмотрев в Интернете, я обнаружил, что обычно вы можете добавлять несколько вложений к электронному письму только в том случае, если вложения получены из формы ввода, которая позволяет выполнять несколько отправок одновременно https://phppot.com/php/send-email-with-multiple-attachments-using-php/. Файлы хранятся вместе в виде массива и прикрепляются циклически по массиву. Для меня важно не извлекать несколько файлов из одного ввода формы, поэтому мне не нравится этот вариант. Я подумал, что может помочь, если я сам сохраню информацию о файле в массивах, но это тоже не сработало.

$fileNameArray = array($file1Name, $file2Name, $file3Name);
$filePathArray = array($file1Path, $file2Path, file3Path);
// . . .
for($i = 0; $i < 3; $i++) {
$mail->addAttachment($fileDataArray[$i], $fileNameArray[$i]);
}
$mail->Send();

Затем я попробовал решение, в котором я пытался отправить несколько писем, каждое в ответ на предыдущий, содержащий одно вложение. Это тоже не сработало. После первого письма никаких других вложений не было.

$fileNameArray = array($file1Name, $file2Name, $file3Name);
$filePathArray = array($file1Path, $file2Path, file3Path);
for($i = 0; $i < 3; $i++) {
$mail = new PHPMailer;
$mail->IsSMTP();
$mail->Host = 'smtp.gmail.com'; 
$mail->Port = '587';        
$mail->SMTPAuth = true;       
$mail->Username = 'email@gmail.com';     
$mail->Password = 'password';     
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;     
//  . . .
$mail->Body = $mail_body;
 
$mail->addAttachment($filePathArray[$i], $fileNameArray[$i]);   

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

https://sourceforge.net/p/phpmailer/discussion/130418/thread/42bf5695/ https://developer-paradize.blogspot.com/2015/02/how-to-fix-multiple-attachments-problem.html

Я немного не понимаю, что делать в этот момент. Если кто-нибудь знает, как добавить несколько вложений в электронное письмо с помощью PHPMailer, не могли бы вы мне помочь? Ваша помощь очень ценится. Спасибо.

1 Ответ

2 голосов
/ 05 августа 2020

На этот вопрос ответил synchro в другой ветке. https://github.com/PHPMailer/PHPMailer/issues/2098

«Темы, на которые вы указали, устарели!

Статья об уникальных идентификаторах давно устарела; встроенные вложения с повторяющимися значениями cid по-прежнему будут игнорироваться , но это ожидаемое поведение и применяется только к встроенным вложениям, созданным с помощью addEmbeddedImage () и addStringEmbeddedImage ().

Ключевая проблема здесь в том, что вы просто не обрабатываете загрузки должным образом. Как вы должны обрабатывать загрузки, описано в документах PHP и все, что происходит до того, как PHPMailer принимает какое-либо участие.

Прежде всего, вам нужно понять, как работают входные данные файлов. Они определяют, что отображается в суперглобале $ _FILES, который PHP заполняется за вас. У вас может быть несколько входных типов файлов, каждый из которых выбирает по одному файлу, или один, позволяющий выбирать несколько файлов. PHPMailer в любом случае не заботится, но вам придется.

Далее вам нужно убедиться, что вы используете move_uploaded_file или хотя бы is_uploaded_file по порядку для проверки того, что находится в суперглобале $ _FILES, иначе это небезопасно.

В-третьих, вам нужно проверить, успешны ли вызовы addAttachment () - в настоящее время вы просто предполагаете, что они работают и не имеют проверка ошибок вообще.

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

...