Home > Software engineering >  I'm trying to pass dynamic values to an .html file before sending it as an attachment using Php
I'm trying to pass dynamic values to an .html file before sending it as an attachment using Php

Time:10-10

I'm trying to send an .html file as an attachment using PHP-mailer, however, I want to dynamically modify some values in the file before it's added and sent. I'm not sure if my logic is okay but the email is sending but it's not sending with an attachment. Below is my code sample.

    for($i=0; $i<count($_FILES['attachment']['name']); $i  ) {
    if ($_FILES['attachment']['tmp_name'][$i] != ""){   
        $templateFile = $_FILES['attachment']['tmp_name'];
        $attStr = file_get_contents($templateFile);
        $attStrNew = str_replace("[-email-]" ,$email, $attStr );
        $templateFile = file_put_contents($attStr, $attStrNew);
        $mail->AddAttachment($templateFile[$i],$_FILES['attachment']['name'][$i]);
       }
   }

CodePudding user response:

file_put_contents() arguments seem to be wrong. First argmument is file name, and I don't think you want $attStr to be the filename. Also it returns the number of bytes written or false and sets $templateFile to it.

Here is a rewrite with a cleaner approach:

  • create an array for tmp files
  • go thru all attachments
  • read the template file
  • replace the template variables
  • write the new content into a new tmp file
  • collect the tmp file name to delete after sending
  • set the tmp file as attachment
$tmpFiles = [];
foreach ($_FILES['attachment']['name'] as $filename) {
    if (empty($filename)) {
        continue;
    }
    $content  = file_get_contents($filename);
    $content  = str_replace("[-email-]", $email, $content);
    $tmpFilename = tempnam("/tmp", 'attachment');
    $tmpFiles[] = $tmpFilename;
    file_put_contents($tmpFilename, $content);
    $mail->AddAttachment($tmpFilename, $filename);
}

// send the mail and then delete the tmp files.

array_walk($tmpFiles, 'unlink');
  • Related