Search code examples
phpphp4

Using mail() to send an attachment AND text/html in an email in PHP4


To make life difficult, the client I'm working for is using a really large yet old system which runs on PHP4.0 and they're not wanting any additional libraries added.

I'm trying to send out an email through PHP with both an attachment and accompanying text/html content but I'm unable to send both in one email.

This sends the attachment:

$headers = "Content-Type: text/csv;\r\n name=\"result.csv\"\r\n Content-Transfer-Encoding: base64\r\n Content-Disposition: attachment\r\n boundary=\"PHP-mixed-".$random_hash."\"";
$output = $attachment;

mail($emailTo, $emailSubject, $output, $headers);

This sends text/html:

$headers = "Content-Type: text/html; charset='iso-8859-1'\r\n";
$output = $emailBody; // $emailBody contains the HTML code.

This sends an attachment containing the text/html along with the attachment contents:

$headers = "Content-Type: text/html; charset='iso-8859-1'\r\n".$emailBody."\r\n";
$headers = "Content-Type: text/csv;\r\n name=\"result.csv\"\r\n Content-Transfer-Encoding: base64\r\n Content-Disposition: attachment\r\n boundary=\"PHP-mixed-".$random_hash."\"";
$output = $attachment;

What I need to know is how can I send an email with text/html in the email body and also add an attachment to it. I'm sure I'm missing something really simple here!

Thanks in advance.


Solution

  • Okay, I've finally cracked it! For reference:

    $emailBody .= "<html><body>Blah</body></html>";
    $emailSubject = "Subject";
    $emailCSV = "\"Col1\", \"Col2\"\r\n"; // etc.
    $attachment = $emailCSV;
    
    $boundary = md5(time());
    
    $header = "From: Name <[email protected]>\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed;boundary=\"" . $boundary . "\"\r\n";
    
    $output = "--".$boundary."\r\n";
    $output .= "Content-Type: text/csv; name=\"result.csv\";\r\n";
    $output .= "Content-Disposition: attachment;\r\n\r\n";
    $output .= $attachment."\r\n\r\n";
    $output .= "--".$boundary."\r\n";
    $output .= "Content-type: text/html; charset=\"utf-8\"\r\n";
    $output .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
    $output .= $emailBody."\r\n\r\n";
    $output .= "--".$boundary."--\r\n\r\n";
    
    mail($emailTo, $emailSubject, $output, $header);