Frederik Voordeckers
Frederik Voordeckers

Reputation: 1331

PHP mail opens in Gmail but not in Outlook

When I send a mail with PHP it displays correct in Gmail but not in Outlook. It's a mail with a PDF attachment and some text. The PDF is created with fpdf and sent as an attachment, this works fine in Gmail and Outlook.

The only problem there is, in Gmail the text of the emails is displayed correctly and in Outlook it's just a blank page and the text is an extra attachment.

Here is my code:

// encode data 
$pdfdoc = $pdf->Output("", "S");
$attachment = chunk_split(base64_encode($pdfdoc));

// email stuff (change data below)
$to = $contactEmail; 
$from = $myEmail; 
$subject = "MySubjectHere"; 
$message = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
            <html><head></head><body>
            <p>Hi '$contactName.',</p><br>
            <p>Please find your pdf attached per your request.</p>
            <p>Feel free to call or email if you have any questions.</p>
            <p>Kind regards,</p><br>
            <p>MyNameHere</p>
            <p><strong>Manager</strong></p>
            <img alt="image" src="http://LinkToImage.png"/>
            <p style="color:#76923c;">
            <strong>P:</strong> 01 2345 6789| 
            <strong>W:</strong> <a href="http://www.example.com" target="_blank">www.example.com</a></p>
            <p style="color:#76923c;">
            <strong>A:</strong> 94 Test Street. 
            </p></body></html>';

// a random hash will be necessary to send mixed content
$separator = md5(time());

// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;

// attachment name
$filename = $id."_".str_replace(" ","_",$Name).'.pdf';

// main header
$headers  = "From: ".$from.$eol;
$headers .= "Bcc: ".$from.$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"";

// no more headers after this, we start the body! //

$body = "--".$separator.$eol;
$body .= "Content-Transfer-Encoding: 7bit".$eol.$eol;

// message
$body .= "--".$separator.$eol;
$body .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $message.$eol;

// attachment
$body .= "--".$separator.$eol;
$body .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment".$eol.$eol;
$body .= $attachment.$eol;
$body .= "--".$separator."--";

// send message
mail($to, $subject, $body, $headers);

Upvotes: 1

Views: 2694

Answers (3)

Meenu Sharma
Meenu Sharma

Reputation: 51

$separator = md5(time());
$eol = "\r\n";
$message="";  // Always empty
$mailmessage="<h1>Yes got it</h1>";  //html content

$headers = "From: ".$email.$eol;
$headers .= "Bcc:". $Bcc. "\n";
$headers .= "Cc:". $cc. "\n"; 
$headers .= "Return-Path: <".$email.">\n";
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;

$body .= "--" . $separator . "\r\n";
$body .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$body .= "Content-Transfer-Encoding: 7bit\r\n";
$body .= $message . "\r\n";

$body = "--" . $separator . $eol;
$body .= "Content-type: text/html; charset=\"utf-8\"\r\n";
$body .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$body .= $mailmessage . $eol.$eol;

$body .= "--" . $separator . $eol;
$body .= "Content-Type: application/octet-stream; name=\"" . $file . "\"" . $eol;
$body .= "Content-Transfer-Encoding: base64" . $eol.$eol;
$body .= "Content-Disposition: attachment" . $eol;
$body .= $content . $eol;
$body .= "--" . $separator . "--";

mail($to, $subject, $body, $headers);

Upvotes: 0

Frederik Voordeckers
Frederik Voordeckers

Reputation: 1331

I found where it went wrong:

 $body .= $message.$eol;

Should be

 $body .= $message.$eol.$eol;

Finally found it after 3 days!
Thanks for the responses anyway!

Upvotes: 2

Joel
Joel

Reputation: 1

$to = $contactEmail; 
$from = $myEmail; 
$boundary = md5(date('r', time()));
$msg  = "This is a multi-part message in MIME format.\n\n";
$msg .= "--$boundary\n";
$msg .= "Content-Type: text/html; charset=utf-8; format=flowed; delsp=yes\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
$msg .= "<h1>Website Enquiry</h1>
            <p><strong>Name:</strong> $name<br />
            <strong>Email:</strong> $email<br />
            <strong>Phone:</strong> $phone<br />
            <strong>Subject Name:</strong> $subject<br />
            <strong>Question:</strong> $question</p>";

$e_headers = "From: " . $from . "\n";
$e_headers .= "MIME-Version: 1.0\n";
$e_headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";

mail($to, $subject, $msg, $e_headers);

This is the code I would use for a HTML contact form. You shouldn't need to pass the content through the PHP_EOL, just the attachment

Upvotes: 0

Related Questions