Foros del Web » Programando para Internet » PHP »

Problema con envío de correos

Estas en el tema de Problema con envío de correos en el foro de PHP en Foros del Web. Hola a todos. Bueno, esta vez tengo un problemilla con el envio de correos usando imap_mail, aunque el problema no esta en la funcion como ...
  #1 (permalink)  
Antiguo 14/12/2008, 17:48
 
Fecha de Ingreso: abril-2007
Mensajes: 32
Antigüedad: 17 años
Puntos: 0
Problema con envío de correos

Hola a todos.

Bueno, esta vez tengo un problemilla con el envio de correos usando imap_mail, aunque el problema no esta en la funcion como tal, sino en su contenido. Cuendo yo armo el mail para enviarlo, incluso con archivos adjuntos, funciona bien o por lo menos Gmail reconoce el mail perfectamente... pero mi cliente de correo solo reconoce el mensaje.

Es como si me faltara alguna cabecera o estuviera mal estructurado el correo, pues, estuve leyendo y eso se guia por "boundary" (o bueno, eso entendí), pèro no se que puede estar pasando. Me gustaria saber como puedo organizar el correo o por lo menos como lo estructura gmail para que lo envie bien y el cliente lo reciba bien, ya que mi cliente de correo lo recibe bien desde gmail, pero no desde si mismo.

Ahi envio el codigo del e-mail, lo tome de varias paginas que estuve leyendo.

<?php
function enviar_correo( $to, $asunto )
{
$boundary= md5(time()); //valor boundary
$htmlalt_boundary= $boundary. "_htmlalt"; //boundary suplementario
$subject=$asunto; //titulo del correo
$de=$_POST["de"]."@prepara2.com";
//cabeceras para enviar correo en formato HTML
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"". $boundary. "\"\r\n"; //datos mixteados
$headers .= "From: ". $de. "\r\n"; //correo del que lo envia

//incia cuerpo del mensaje que se visualiza
$cuerpo="--". $boundary. "\r\n";
$cuerpo .= "Content-Type: multipart/alternative; boundary=\"". $htmlalt_boundary. "\"\r\n\r\n"; //contenido alternativo: texto o html
$cuerpo .= "--". $htmlalt_boundary. "--\r\n";
$cuerpo .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: 8bits\r\n\r\n";
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo.=stripslashes($_POST["txteditor"]);
$cuerpo .= "\r\n\r\n";
$cuerpo .= "--". $htmlalt_boundary. "--\r\n\r\n"; //fin cuerpo mensaje a mostrar
//--------------------REPETIDO-----------------
$cuerpo="--". $boundary. "\r\n";
$cuerpo .= "Content-Type: multipart/alternative; boundary=\"". $htmlalt_boundary. "\"\r\n\r\n"; //contenido alternativo: texto o html
$cuerpo .= "--". $htmlalt_boundary. "--\r\n";
$cuerpo .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: 8bits\r\n\r\n";
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo.=stripslashes($_POST["txteditor"]);
$cuerpo .= "\r\n\r\n";
$cuerpo .= "--". $htmlalt_boundary. "--\r\n\r\n"; //fin cuerpo mensaje a mostrar
//--------------------FIN REPETIDO--------------
//archivos adjuntos
//echo print_r($_FILES["archivo"]["name"])."<br>";
$adj=$_FILES["archivo"];
$total=count($adj["name"]);
//echo "total: ".$total."<br>";
for($cont=0;$cont<$total;$cont++){
if($adj["size"][$cont]>0){
//echo $adj["name"][$cont]." - ".$adj["tmp_name"][$cont]." - ".$adj["type"][$cont]." - ".$adj["size"][$cont]."<br>";
$cuerpo .= "--". $boundary. "\r\n\r\n";
$cuerpo .= "Content-Type: ". $adj["type"][$cont]. "; name=\"". $adj["name"][$cont]. "\"\r\n"; //envio directo de datos
$cuerpo .= "Content-Transfer-Encoding: BASE64\r\n";
$cuerpo .= "Content-Disposition: attachment; filename=\"". $adj["name"][$cont]. "\"\r\n\r\n";
//lectura del archivo
$fp= fopen( $adj["tmp_name"][$cont], "r" ); //abrimos archivo
$buf= fread( $fp, filesize($adj["tmp_name"][$cont]) ); //leemos archivo completamente
fclose($fp); //cerramos apuntador;
$cuerpo .= base64_encode($buf). "\r\n\r\n";
}
}
$cuerpo .= "--". $boundary. "--\r\n\r\n";
echo "Cuerpo: <br>".$cuerpo;
//funcion para enviar correo
if( imap_mail($to,$subject,$cuerpo,$headers,$_POST["correos_cc"],$_POST["correos_cco"]) == FALSE )
return 0;
return 1;
}

if(trim($_POST["asunto"])!=""){
$mail=enviar_correo($_POST["correos_para"],$_POST["asunto"]);
if($mail==0){
echo "No se pudo enviar el correo";
}
else{
echo "Si se pudo enviar el correo";
}
}
?>

Agradezco cualquier ayuda posible...Saludos.
  #2 (permalink)  
Antiguo 15/12/2008, 22:58
 
Fecha de Ingreso: abril-2007
Mensajes: 32
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema con envío de correos

Bueno, ya logré resolver el problema. Lo que pasa es que al escribir el correo y según la especificación del MIME (RFC 2045,2046,2047, si no estoy mal), los boundaries deben tener cierta cantidad de saltos de línea, además de que revise que mis cabeceras estaban mal ubicadas.

Ahi les dejo el codigo para que lo miren e igual ya es funcional, tanto para enviar a otros clientes de correo como al de uno mismo:

$limext="externo";
$limint="interno";
$subject=$asunto; //titulo del correo
$de=$_POST["de"]."@prepara2.com";
if($_FILES["archivo"]){
//cabeceras para enviar correo en formato HTML
$headers = "From: ". $de. "\r\n"; //correo del que lo envia
if($fun=="borrador"){
$headers .= "To: ". $to. "\r\n";
if($_POST["correos_cc"]!="")
$headers .= "Cc: ". $_POST["correos_cc"]. "\r\n";
if($_POST["correos_cco"]!="")
$headers .= "Bcc: ". $_POST["correos_cco"]. "\r\n";
$headers .= "Subject: ". $subject. "\r\n";
}
$headers .= "Delivered-To: ". $de. "\r\n"; //correo del que lo envia
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$limext. "\"\r\n"; //datos mixteados
//incia cuerpo del mensaje que se visualiza
$cuerpo="--". $limext . "\r\n";
$cuerpo .= "Content-Type: multipart/alternative; boundary=\"". $limint. "\"\r\n\r\n"; //contenido alternativo: texto o html
$cuerpo .= "--". $limint. "\r\n";
$cuerpo .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: 8bit\r\n";
$cuerpo .= "Content-Disposition: inline\r\n\r\n";
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo.=stripslashes($_POST["txteditor"]);
$cuerpo .= "\r\n";
$cuerpo .= "--". $limint. "\r\n"; //fin cuerpo mensaje a mostrar
//--------------------REPETIDO-----------------
$cuerpo .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: quoted-printable\r\n";
$cuerpo .= "Content-Disposition: inline\r\n\r\n";
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo.=imap_8bit(stripslashes($_POST["txteditor"]));
$cuerpo .= "\r\n";
$cuerpo .= "--". $limint. "--\r\n\r\n"; //fin cuerpo mensaje a mostrar
//--------------------FIN REPETIDO--------------
//archivos adjuntos
//echo print_r($_FILES["archivo"]["name"])."<br>";
$adj=$_FILES["archivo"];
$total=count($adj["name"]);
//echo "total: ".$total."<br>";
for($cont=0;$cont<$total;$cont++){
if($adj["size"][$cont]>0){
//echo $adj["name"][$cont]." - ".$adj["tmp_name"][$cont]." - ".$adj["type"][$cont]." - ".$adj["size"][$cont]."<br>";
$cuerpo .= "--". $limext. "\r\n";
$cuerpo .= "Content-Type: ". $adj["type"][$cont]. "; name=\"". $adj["name"][$cont]. "\"\r\n"; //envio directo de datos
$cuerpo .= "Content-Transfer-Encoding: BASE64\r\n";
$cuerpo .= "Content-Disposition: attachment; filename=\"". $adj["name"][$cont]. "\"\r\n\r\n";
//lectura del archivo
$fp= fopen( $adj["tmp_name"][$cont], "r" ); //abrimos archivo
$buf= fread( $fp, filesize($adj["tmp_name"][$cont]) ); //leemos archivo completamente
fclose($fp); //cerramos apuntador;
$cuerpo .= chunk_split(base64_encode($buf)). "\r\n";
}
}
$cuerpo .= "--". $limext. "--\r\n\r\n";
}

Bueno, esto es solo para el de adjuntos, por que si se va a enviar sin adjuntos la estructura cambia en base a que ya no se necesita el multipart/mixed.

Gracias de todas formas. Saludos desde Bogotá, Colombia.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:20.