Search code examples
phpphpmailerdompdf

PHP - Dompdf and PHPMailer unexpected behavior


I am working on a web application using PHP as a server-side and a jQuery framework as a client-side.

One of the scenarios of the application is to send an email with pdf file attached I am doing this using PHPMailer and Dompdf libraries.

I had created a function named sendMail in a file name send.php accept 4 params (receiver email,subject,data,email number) the last param is because I have 5 different emails may be sent depending on the situation and data param is the data will be rendered in the html email body.

The problem is when I call the function from send.php it work as expected the email sent and pdf file created and attached to the email .

but when I require send.php in any other file and call sendMail function I get the email only without any pdf file and the file not even generated or saved on the server.

send.php

<?php
require_once 'dompdf/autoload.inc.php';
// reference the Dompdf namespace
use Dompdf\Dompdf;
require 'PHPMailerAutoload.php';
$body = "test message";
sendMail('peter@w34.co','MLS mail',$body,5);


function sendMail($email,$subject,$body,$index){

    $mail = new PHPMailer;

    $mail->IsSMTP();  // telling the class to use SMTP
    $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
    $mail->SMTPAuth   = true; // SMTP authentication
    $mail->SMTPSecure = 'tls'; // secure transfer enabled REQUIRED for GMail
    $mail->Host       = "smtp.gmail.com"; // SMTP server
    $mail->Port       = 587; // SMTP Port
    $mail->Username   = "peterwilson.intake34@gmail.com"; // SMTP account username
    $mail->Password   = "Password";  // SMTP account password                                  // TCP port to connect to

    $mail->From = 'peter@example.com';
    $mail->FromName = 'Wilson';


    $mail->addAddress($email);     // Add a recipient

    $mail->isHTML(true);   // Set email format to HTML

    $mail->Subject = $subject;    
    $mail->Body=$body;

    // instantiate and use the dompdf class
    $dompdf = new Dompdf();
    $dompdf->loadHtml($body);
    // Render the HTML as PDF
    $dompdf->render();

    $output = $dompdf->output();
    $file_to_save= "../work-orderes/file.pdf";       
    file_put_contents($file_to_save, $output);

    $mail->addAttachment('../work-orderes/file.pdf');  


    if(!$mail->send()) {

    //    echo  $mail->ErrorInfo;
    } else {
        return 1;
    }
}
?>

save.php

<?php
 require("sendSmtp/send.php");
 session_start();
 $body = "Hello World!";        

 sendMail('peter@w34.co','MLS mail',$body,5);


 ?>

Any suggestions about why Dompdf not works when calling it from any other file ??

What I have tried

  • removing dompdf and reinstall the latest stable version from here
  • cleaning all code and just leave sendMail function and calling it
  • try to write the code from the beginnig

Solution

  • I solved it finally!

    after debugging I found that everything going fine till $output = $dompdf->output(); after that I get an error on save the file using $file_to_save= "../work-orderes/file.pdf";

    this work properly when I call the function sendMail() from send.php but when I call it from another file I get an error regarding accessing the path.

    The Answer here that I should use the absolute path not the relative one like below

    $file_to_save= $_SERVER['DOCUMENT_ROOT']."\work-orderes/file.pdf";
    

    now the file saved successfully and attached to the email like expected!