views:

59

answers:

2

Hello,

Had finally gotten all the bugs out of this and now they said "Oh, we'll need to add attachments..." So, this sends an html mail with a plaintext version and was doing just swell. Now that I have the attachments arriving the mail clients are showing the plaintext version inline and the html version as another attachment and then a seemingly empty 93 byte file with a name like ATT00248.txt.

Can anyone either bash me over the head from behind or tell me where I am going wrong? I want the HTML inline where available in the mail user interface, the plain text version where HTML is not available, and the single attachment as an attachment.

Any help?

TIA,

JG

<?php
$template = $_SERVER['DOCUMENT_ROOT'] . '/leads/templates/'.$_SESSION['templateFile'];
ob_start();
include($template);
$html = ob_get_contents();
ob_end_clean();

if (strlen($html) == 0) {
    echo "The template at $template did not load.";
    exit;
}

$email   = $_SESSION['user']->email;
$name    = $_SESSION['user']->first_name . ' ' . $_SESSION['user']->last_name;
$from = "$name <$email>";
$subject = unslash($_SESSION['subject']);

$TextMessage =  strip_tags(unslash($_SESSION['message']));

$notice_text = "This is a multi-part message in MIME format.";
$plain_text =  str_replace('&nbsp;',' ', $TextMessage);

if ($_SESSION['attachment']) {
    $fileatt = 'files/' . $_SESSION['attachment'];
    $file = fopen($fileatt,'rb');
    $data = fread($file,filesize($fileatt));
    fclose($file);
    $data = chunk_split(base64_encode($data));
    $mailtype = 'mixed';

    $fileatt_type = "application/octet-stream"; 
    $fileatt_name = $_SESSION['attachment'];
} else {
    $mailtype = 'alternative';
}

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

$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

--$mime_boundary
";

$body .= "Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
"Content-Disposition: attachment;\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--$mime_boundary\n";



// #1  //
if ($to = $_SESSION['recipients'][0]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);

    echo "Email sent to " . htmlentities($to) . ".<br />";
}


// #2  //
if ($to = $_SESSION['recipients'][1]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);
    echo "Email sent to " . htmlentities($to) . ".<br />";
}

// #3  //
if ($to = $_SESSION['recipients'][2]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);
    echo "Email sent to " . htmlentities($to) . ".<br />";
}

// #4  //
if ($to = $_SESSION['recipients'][3]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);
    echo "Email sent to " . htmlentities($to) . ".<br />";
}

// #5 //
if ($to = $_SESSION['recipients'][4]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);
    echo "Email sent to " . htmlentities($to) . ".<br />";
}

// CC self?  //
if ($_SESSION['cc_me']) {
    mail($from, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);
    echo "Email sent to " . htmlentities($from) . ".<br />";
}

if ($fileatt) {
    unlink($fileatt);
}

echo "<a href='email_start.php'>Click here</a> to send another email.";
list($_SESSION['email'], $_SESSION['subject'], $_SESSION['bullets'], $_SESSION['message'], 
    $_SESSION['templateFile'], $_SESSION['template'], $_SESSION['cc_me'], $_SESSION['recipients']) = '';
?>
A: 

I'd post this as a comment, but it's too long.

// #1  //
if ($to = $_SESSION['recipients'][0]) {
    mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header);

    echo "Email sent to " . htmlentities($to) . ".<br />";
}


// #2  ... #3 ... #4 ... #5

Will end up executing all blocks, since ($to = $_SESSION['recipients'][0]) will be always true. It will also display the "Email sent to ..." even when mail() fails.

What you want is:

if (in_array($to, $_SESSION['recipients'])) {
    if (mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header)) {
        echo "Email sent to " . htmlentities($to) . ".<br />";
    }
}

Or, if you really want to mail everyone, or

foreach ($_SESSION['recipients'] as $to ) {
    if (mail($to, $subject, $body,
    "From: " . $from . "\n" .
    "MIME-Version: 1.0\n" .
    "Content-Type: multipart/$mailtype;\n" .
    "     boundary=" . $mime_boundary_header)) {
        echo "Email sent to " . htmlentities($to) . ".<br />";
    }
}
quantumSoup
Thanks for the reply. I should have posted a link to this:http://stackoverflow.com/questions/3419858/php-mail-sends-empty-content-when-looping-over-array-of-addressesAs an explanation of why I iterated the way I did.
jerrygarciuh
A: 

Pekka had it right - It was simple and robust to use Swiftmailer. http://swiftmailer.org

jerrygarciuh