2012-08-24 15 views
5

Así que estoy tratando de enviar un correo electrónico HTML bastante simple usando PHP. He pasado los últimos tres días tratando de encontrar una buena solución y creo haber encontrado una, pero cuando la pruebo, no se envía correctamente. Tomé prestado este código de uno de los tutoriales a los que me refería. El código de prueba es el siguiente:Enviando multipart/alternative con PHP mail()

<?php 
//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Test HTML email'; 
//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 
$headers = "From: [email protected]\r\nReply-To: [email protected]"; 
//add boundary string and mime type specification 
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"".$random_hash."\""; 
//define the body of the message. 
ob_start(); //Turn on output buffering 
?> 
--<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit 

Hello World!!! 
This is simple text email message. 

--<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit 

<h2>Hello World!</h2> 
<p>This is something with <b>HTML</b> formatting.</p> 

--<?php echo $random_hash; ?>-- 
<? 
//copy current buffer contents into $message variable and delete current output buffer 
$message = ob_get_clean(); 
//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"; 
?> 

El problema es que, a pesar de que envía el correo electrónico muy bien, ya sea que lo envía como texto sin formato, o un mensaje en blanco en Gmail. ¿Alguna idea de por qué?

Respuesta

7

que debería, por supuesto, le dirá a utilizar una biblioteca para ello, tales como rápido, pero creo que esto es un buen ejercicio para que te voy a decir lo que está mal con él :)

Es porque sus finales de línea estan equivocados. A menos que se especifique lo contrario, las terminaciones de línea en mensajes de correo electrónico son CRLF (\r\n), mientras que su bloque ob_start() es probable que solo tenga LF (\n) como separador de línea.

Esto hace que GMail malinterprete el mensaje de correo electrónico y no muestra nada en su lugar. En mi caso, muestra un archivo de descarga vacío;)

+0

¡Un archivo de descarga vacío era exactamente lo que estaba obteniendo! Terminé buscando otro tutorial y comencé de cero. ¡Gracias por la rápida respuesta! – Bryan

+0

Absolutamente. Una biblioteca es esencial. Pegar tus propios correos electrónicos compatibles con RFC en PHP no es algo que desearía en mi peor enemigo. Si sus correos electrónicos no son totalmente compatibles, es mucho más probable que se marquen como spam. El riesgo de hacerlo mal es simplemente demasiado alto. – tadman

+0

Tuve un problema donde estaba usando '\ r \ n' y Outlook no mostraba mi mensaje, aunque Gmail si. Hice lo contrario aquí y SÓLO usé '\ n' para solucionarlo. Es extraño, porque en todas partes que miré usé CRLF. – James