Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding Multiple Attachments in PHPMailer

I am trying to attach multiple images in the attachments. I have used forearch for every attachment but, its not getting the tempname and name when I use foreach, I'm probably doing something wrong. Below is the code and errors:

Input HTML

<input id="upload-file" class="upload-file" type="file" name="upload-file[]">

var_dump of $_FILES['upload-file']:

array(5) { ["name"]=> array(1) { [0]=> string(47) "WRANGLER_AW13_GIRLONTOP_A4_LANDSCAPE_300dpi.jpg" } ["type"]=> array(1) { [0]=> string(10) "image/jpeg" } ["tmp_name"]=> array(1) { [0]=> string(24) "C:\xampp\tmp\php41DC.tmp" } ["error"]=> array(1) { [0]=> int(0) } ["size"]=> array(1) { [0]=> int(91742) } } 

var_dump for name and temp_name:

Notice: Undefined index: name in C:\xampp\htdocs\hmg\process-email.php on line 66

Notice: Undefined index: tmp_name in C:\xampp\htdocs\hmg\process-email.php on line 67

NULL 
NULL

CODE:

foreach($_FILES['upload-file'] as $file) {         

    $name = $file['name'];
    $path = $file['tmp_name'];
    var_dump($name);
    var_dump($path);

    //And attach it using attachment method of PHPmailer.

    $mail->addattachment($path,$name);
}
like image 791
Fahad Sohail Avatar asked Mar 13 '15 12:03

Fahad Sohail


People also ask

How to attach multiple files in PHPMailer?

PHP Code to Attach Multiple Files to the EMailThe multiple files posted via the HTML form will be read by using $_FILES array variable. This array is iterated the corresponding file will be attached by calling the addAttachment() function with the reference of the mail object. <? php require('phpmailer/class.

How do I attach multiple files to an email?

Navigate to the file location for your files. Click the first one, and then hold the Control key and click the additional files. Press the button to choose your files and close the browse window. Depending on the program you are using, the button will say something like “Insert” or “Open.”

How to send email with attachment using PHPMailer?

File Attachmentsmail->Send(); and it's called AddAttachment($path); . This single line will add the attachment to your mail. $path is the path of the filename. It can be a relative one (from your script, not the PHPMailer class) or a full path to the file you want to attach.


3 Answers

Welcome to the evil side of PHP. The $_FILES is not that, what a developer would expect.

//wrong code
$img1 = $_FILES['upload-file'][0]['tmp_name'];
$img2 = $_FILES['upload-file'][1]['tmp_name'];

//working code
$img1 = $_FILES['upload-file']['tmp_name'][0];
$img2 = $_FILES['upload-file']['tmp_name'][1];

So you need something like

$totalFiles = count($_FILES['upload-file']['tmp_name']);
for ($i = 0; $i < $totalFiles; $i++) {
   $name = $_FILES['upload-file']['name'][$i];
   $path = $_FILES['upload-file']['tmp_name'][$i];
   $mail->addattachment($path,$name);
}

Here is some example from the PHPMailer repository.

like image 79
Christian Gollhardt Avatar answered Nov 14 '22 18:11

Christian Gollhardt


thanks for all the answers. I am sure all of your approaches would work just fine, but I decided to solve it myself. This code solved the problem

$validAttachments = array();

foreach($_FILES['upload-file']['name'] as $index => $fileName) {
    $filePath = $_FILES['upload-file']['tmp_name'][$index];
    $validAttachments[] = array($filePath, $fileName);              
}

foreach($validAttachments as $attachment) {
    $mail->AddAttachment($attachment[0], $attachment[1]);
}

I hope anyone who has the same problem gets some help from here ...

like image 24
Fahad Sohail Avatar answered Nov 14 '22 20:11

Fahad Sohail


Most of the solutions here are based on forms.

So i came up with a simple solution if you want to attach all files from a particular directory.

$file_to_attach_directory = 'files/';
if ($handle = opendir($file_to_attach_directory)) {
    try {
        while (false !== ($entry = readdir($handle))) {
            $attachment_location = $file_to_attach_directory. $entry;
            $mail->addAttachment($attachment_location);
        }
        closedir($handle);
        // Send Mail
        if (!$mail->send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
        } else {
            echo "Message sent!";
        }
    } catch (Exception $e) {
        var_dump($e);
    }
}
like image 1
Shirshandu Bhattacharjee Avatar answered Nov 14 '22 20:11

Shirshandu Bhattacharjee