Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending HTML newsletters with plain-text fallback

I am currently using a script which uses file_get_contents to get the contents of a php file, and then sends it inside an email to a list of customers. I would like to alter the script to allow for plain-text fallback to reduce the risk of being marked as spam.

This is the script I have at the moment:

    function sendit($to,$subject,$body)
{
$headers    =   "To: <{$to}>\n".
                    "From: Test Newsletter Admin <[email protected]>\n".
                    "Reply-To: Test Newsletter Admin <[email protected]>\n".
                    "MIME-Version: 1.0\n".
                    "Content-Type: text/html; charset=ISO-8859-1\n";

    $mail_sent = @mail($to, $subject, $body, $headers);
    return $mail_sent;
}
$content = file_get_contents('attach/newsletter.php');
//require_once('../../func.php');
set_time_limit(0);
date_default_timezone_set('Europe/London');

$log = fopen('send'.date('dmY',time()).'.log','wb');

//$array = file('NonCustClean.txt');
$array = file('devaddresses.txt');
// Delay In Seconds between emails (must be INT)
$delay = 10;
$count = count($array);

$end = time()+ ($delay*$count);

echo "Start Time: ".date('d/m/Y H:i:s',time()).'<br />';
echo "Estimated End Time: ".date('d/m/Y H:i:s',$end).'<br />';
echo "(".dateDiff(time(),$end).")<br />"; 

foreach ($array as $email)
 {

$status = (sendit(trim($email), 'Test Newsletter',$content))?'Sent':'failed';
 fwrite($log,date('[d/m/Y H:i:s]',time()).' Email '.$status.' to '.trim($email)."\n");
 echo date('[d/m/Y H:i:s]',time()).' Email '.$status.' to '.trim($email)."</br>";
 flush(); 
  sleep(10);
 }

Newsletter.php just contains basic HTML/CSS code.

Could someone please advise how I can alter this script to accompany a plain-text fallback?

Thanks for any help.

like image 541
user1138966 Avatar asked Jan 09 '12 15:01

user1138966


1 Answers

What you're looking for is known as a multipart e-mail. It's body contains both HTML and text, delimited by a so called "boundary". The e-mail client will then determine itself if it will show the HTML or Text version of the mail, based on it's capabilities and user preferences.

An example on how you can set this up (source):

$notice_text = "This is a multi-part message in MIME format.";
$plain_text = "This is a plain text email.\r\nIt is very cool.";
$html_text = "<html><body>This is an <b style='color:purple'>HTML</b>" .
             "text email.\r\nIt is very cool.</body></html>";

$semi_rand = md5(time());
$mime_boundary = "==MULTIPART_BOUNDARY_$semi_rand";
$mime_boundary_header = chr(34) . $mime_boundary . chr(34);

$to = "Me <[email protected]>";
$bcc = "You <[email protected]>, Them <[email protected]>";
$from = "Me.com <[email protected]>";
$subject = "My Email";

$body = "$notice_text

--$mime_boundary
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

$plain_text

--$mime_boundary
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

$html_text

--$mime_boundary--";

if (@mail($to, $subject, $body, 
    "From: " . $from . "\n" . 
    "bcc: " . $bcc . "\n" . 
    "MIME-Version: 1.0\n" . 
    "Content-Type: multipart/alternative;\n" . 
    "     boundary=" . $mime_boundary_header))
    echo "Email sent successfully.";
else
    echo "Email NOT sent successfully!";
like image 123
Oldskool Avatar answered Sep 21 '22 19:09

Oldskool