tags:

views:

630

answers:

2

I have a php script that sends out emails with attachments once people have submitted some information. I receive these emails in my gmail inbox with no problem. However, when I use my personal email address or my work email address the email is never delivered. Is this a problem with my script (below) or some setting I have on the server? I think it might be a problem with the headers, but everytime I change the headers, they break the email and everything appears in the message body. Does anyone know how to fix this? The server is the clients managed linux server with a plesk control panel so I don't have access to the php ini file.

//define the receiver of the email
$to = '[email protected]';
//define the subject of the email
$subject = 'Email with Attachment';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$mime_boundary = "<<<--==+X[".md5(time())."]";

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/';
$fileContent =  chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf')));


$headers .= "From: [email protected] <[email protected]>\r\n";  

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"".$mime_boundary."\"";




$message = "This is a multi-part message in MIME format.\r\n";

$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n";
$message .= "\r\n";
$message .= "Email content and what not: \r\n";
$message .= "This is the file you asked for! \r\n";
$message .= "--".$mime_boundary."" . "\r\n";

$message .= "Content-Type: application/octet-stream;\r\n";
$message .= " name=\"CTF-brochure.pdf\"" . "\r\n";
$message .= "Content-Transfer-Encoding: base64 \r\n";
$message .= "Content-Disposition: attachment;\r\n";
$message .= " filename=\"CTF_brochure.pdf\"\r\n";
$message .= "\r\n";
$message .= $fileContent;
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

//send the email
$mail_sent = mail($to, $subject, $message, $headers);
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
A: 

Check your spam folder on the other accounts. Sometimes, mail can end up in spam if it triggers too many warnings for whatever spam-filtering software the e-mail account provider is using.

John Nicely
thanks for the suggestion but alas it's the first place i looked!
Drew
+2  A: 

Try this multipart alternative version. It accepts both plaintext and html messages and allows the mail client to choose which to display.


//define the receiver of the email
$to = '[email protected]';
//define the subject of the email
$subject = 'Email with Attachment';
//create 2 boundary strings. They must be unique
$boundary1 = rand(0,9)."-"
          .rand(10000000000,9999999999)."-"
          .rand(10000000000,9999999999)."=:"
          .rand(10000,99999);
$boundary2 = rand(0,9)."-".rand(10000000000,9999999999)."-"
          .rand(10000000000,9999999999)."=:"
          .rand(10000,99999);

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/';
$fileContent =  chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf')));

$txt_message = "Email content and what not: \r\n";
$txt_message .= "This is the file you asked for! \r\n";

$html_message = "Email content and what not: <br />";
$html_message .= "This is the file you asked for! ";

$headers     =<<<AKAM
From: [email protected] <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="$boundary1"
AKAM;

$attachment = <<<ATTA
--$boundary1
Content-Type: application/octet-stream;
    name="CTF_brochure.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="CTF_brochure.pdf"

$fileContent

ATTA;

$body = <<<AKAM
This is a multi-part message in MIME format.

--$boundary1
Content-Type: multipart/alternative;
    boundary="$boundary2"

--$boundary2
Content-Type: text/plain;
    charset=ISO-8859-1;
Content-Transfer-Encoding: 7bit

$txt_message
--$boundary2
Content-Type: text/html;
    charset=ISO-8859-1;
Content-Transfer-Encoding: 7bit

$html_message

--$boundary2--

$attachment
--$boundary1--
AKAM;

//send the email
$mail_sent = @mail($to, $subject, $body, $headers);
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
Frank
thanks for this. alas I get no message on the gmail account and nothing through on anything else
Drew