2

I have this problem with PHP mail function: I'm trying to sent an html email with a PDF file in attachment, the file is stored in a folder of mywebsite and created from me with mpdf, but when I send it the mail received has an attachment with size 0b.

this is the code:

<?
$attachment = "path_to_file_pdf.file.pdf";
if( file_exists($attachment)){
    // File Exists
    $size = filesize($attachment);
    if( $size > 0 ){
        //Alternative 1
            $file = fopen($attachment,'rb');
            $content = fread($file, $size);
            fclose($file);
            $content = chunk_split(base64_encode($content));
        //Alternative 1
            //$content = chunk_split(base64_encode(file_get_contents($attachment)));
        $mailto = "example@maito.com";
        $from_name = "MyDomainName";
        $from_mail = "example@mydomain.com";
        $replyto = "example@mydomain.com";
        $uid = md5(uniqid(time()));
        $subject = "e-mail subject here";
        $message = "HTML MESSAGE HERE" ;
        $filename = "file.pdf";
        $header = "From: ".$from_name." <".$from_mail.">\r\n";
        $header .= "Reply-To: ".$replyto."\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"PHP-alt-".$uid."\"\r\n\r\n";
        $header .= "This is a multi-part message in MIME format.\r\n";
        $header .= "--PHP-alt-".$uid."\r\n";
        $header .= "Content-Type: text/html; charset=UTF-8\r\n";
        $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $header .= $message."\r\n\r\n";
        $header .= "--PHP-alt-".$uid."\r\n";
        $header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
        $header .= "Content-Transfer-Encoding: base64\r\n";
        $header .= "Content-Disposition: attachment; \r\n\r\n";
        $header .= $content."\r\n\r\n";
        $header .= "--PHP-alt-".$uid."--";
        if( @mail($mailto, $subject, "", $header) ){
            echo "Mail SENT";
        }else{
            echo "ERROR - Mail error";
        }
    }else{
        echo "ERROR- File size = 0";
    }
}else{
    echo "ERROR - File doesn't exist";
}
?>

The mail is sent correctly, so the file exist and its size is greater than 0b. But when I receive the email in my emailbox it's all correct instead of the attachment that is present but empty. I tryed both the 2 alternative of extracting the file content inserted in the code, but the result is the same. Someone could help me?

pablinho
  • 213
  • 1
  • 4
  • 13

2 Answers2

0

I changed some headers configs. Try this:

<?
$attachment = "path_to_file_pdf.file.pdf";
if( file_exists($attachment)){
    // File Exists
    $size = filesize($attachment);
    if( $size > 0 ){
        //Alternative 1
            $file = fopen($attachment,'rb');
            $content = fread($file, $size);
            fclose($file);
            $content = chunk_split(base64_encode($content));
        //Alternative 1
            //$content = chunk_split(base64_encode(file_get_contents($attachment)));
        $mailto = "example@maito.com";
        $from_name = "MyDomainName";
        $from_mail = "example@mydomain.com";
        $replyto = "example@mydomain.com";
        $uid = md5(uniqid(time()));
        $subject = "e-mail subject here";
        $message = "HTML MESSAGE HERE" ;
        $filename = "file.pdf";
        $header = "From: ".$from_name." <".$from_mail.">\r\n";
        $header .= "Reply-To: ".$replyto."\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"PHP-alt-".$uid."\"\r\n\r\n";
        $header .= "This is a multi-part message in MIME format.\r\n";
        $header .= "--PHP-alt-".$uid."\r\n";
        $header .= "Content-Type: text/html; charset=UTF-8\r\n";
        $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $header .= $message."\r\n\r\n";
        $header .= "--PHP-alt-".$uid."\r\n";
        $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n";
        $header .= "Content-Transfer-Encoding: base64\r\n";
        $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
        $header .= $content."\r\n\r\n";
        $header .= "--PHP-alt-".$uid."--";
        if( @mail($mailto, $subject, "", $header) ){
            echo "Mail SENT";
        }else{
            echo "ERROR - Mail error";
        }
    }else{
        echo "ERROR- File size = 0";
    }
}else{
    echo "ERROR - File doesn't exist";
}
?>
0

Seen that I didn't receive answers, I only found one way to do that without problems, this way is to use PHPMailar class. Thanx to the discussion: Send attachments with PHP Mail()?

Community
  • 1
  • 1
pablinho
  • 213
  • 1
  • 4
  • 13