Search code examples
phpmysqllinuxphpmailer

Headers issue in email attachment in linux


<?php
include 'include/function.php';

//$random_hash = md5(time());
$User=new User();
session_start();

$id=$_POST['id'];
    //$date=$_POST['date'];
    $expected_date=$_POST["expected_date"];

    $comname=$_POST['comname'];
    $type=$_POST["type"];
    $name=$_POST["name"];
    $mime=$_POST["mime"];
    $size=$_POST["size"];
    $file1=$_POST["path"];

    //$comname=$_POST["comname"];
    $remark=$_POST["remark"];

    $other_detail=$_POST['other_detail'];
    $remark=$_POST["remark"];
    //$last_change_time=$row['last_change_time'];
    $email1=$_POST['email1'];
    $email2=$_POST['email2'];
    $email3=$_POST['email3'];
    $email4=$_POST['email4'];



    $email5=$_POST['email5'];
    $email6=$_POST['email6'];
    $username=$_SESSION["username"];
    //$username=$row['username'];



$sql=mysql_query("update  depository set expected_date='$expected_date',comname='$comname',last_change_username='$username',type='$type',name='$name',mime='$mime',size='$size',path='$file1',other_detail='$other_detail',remark='$remark',email1='$email1',email2='$email2',email3='$email3',email4='$email4',email5='$email5',email6='$email6'where id='$id'");






$htmlbody = " Message successfully send ok";


//$to .= [email protected];
//Recipient Email Address [email protected]
$to = $email1. ', ';
$to .= $email3. ', ';
$to .= $email2. ', ';
$to .= "[email protected]"; 
$subject = 'Depositiory Detail From Solution Infinite'; //Email Subject

$headers = "From: [email protected]\r\nReply-To: [email protected]";

$random_hash = md5(date('r', time()));

$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";

$attachment = chunk_split(base64_encode(file_get_contents($file1))); // Set your file path here

//define the body of the message.

$message = "--PHP-mixed-$random_hash\r\n"."Content-Type: multipart/alternative; boundary=\"PHP-alt-$random_hash\"\r\n\r\n";
$message = "--PHP-alt-$random_hash\r\n"."Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"."Content-Transfer-Encoding: 7bit\r\n\r\n";

//Insert the html message.
$message .= $htmlbody;
$message .="\r\n\r\n--PHP-alt-$random_hash--\r\n\r\n";

//include attachment
$message .= "--PHP-mixed-$random_hash\r\n"."Content-Type: application/pdf; name=\"$name\"\r\n"."Content-Transfer-Encoding: base64\r\n"."Content-Disposition: attachment\r\n\r\n";
$message .= $attachment;
$message .= "/r/n--PHP-mixed-$random_hash--";

//send the email
$mail = mail( $to, $subject , $message, $headers );

echo $mail ? "Mail sent" : "Mail failed";


?>

When I send email through windows than send properly but when I run script on linux than attachment mail send in plain text.

Email sent in full text shown in below:

PHP-mixed 83d06f048e070e4cfc0684d0e98f71db    
Content-Type: application/jpg; name="tkt.jpg"    
Content-Transfer-Encoding: base64    
Content-Disposition: attachment


/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG    
BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM    
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAMABVYDASIA    
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA

Solution

  • It is because of situations like this (cross-platform compatibility) that the PHP constant PHP_EOL exists. Do this:

    <?php
        ....
        $eol = PHP_EOL;
        $headers = "From: [email protected]".$eol."Reply-To: [email protected]";
    
        $random_hash = md5(date('r', time()));
    
        $headers .= $eol."Content-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
    
        $attachment = chunk_split(base64_encode(file_get_contents($file1))); // Set your file path here
    
        //define the body of the message.
    
        $message = "--PHP-mixed-$random_hash".$eol."Content-Type: text/html; charset=\"iso-8859-1\"".$eol."Content-Transfer-Encoding: 7bit".$eol.$eol;
    
        //Insert the html message.
        $message .= $htmlbody.$eol.$eol."--PHP-mixed-$random_hash".$eol;
    
        //include attachment
        $message .= "Content-Type: application/pdf; name=\"$name\"".$eol."Content-Transfer-Encoding: base64".$eol."Content-Disposition: attachment; filename=\"".$name."\"".$eol;
        $message .= $attachment;
        $message .= $eol."--PHP-mixed-$random_hash--";
    
        //send the email
        $mail = mail( $to, $subject , $message, $headers );
    
        echo $mail ? "Mail sent" : "Mail failed";
    
    
    ?>
    

    EDIT:

    Based on new information in your comment, and another look at the code, I wonder why windows ever delivered the message as html. You specified the content-type as text/plain here

    $message = "--PHP-alt-$random_hash\r\n"."Content-Type: text/plain; charset=\"iso-8859-1\"\r\nContent-Transfer-Encoding: 7bit\r\n\r\n"
    

    You should change that to simply

    $message = "--PHP-alt-$random_hash".$eol."Content-type:text/html; charset=iso-8859-1".$eol."Content-Transfer-Encoding: 7bit".$eol.$eol;
    

    This should most likely resolve your problem.

    EDIT 2 Check changes I made to the main answer...