[SOLUCIONADO] Como adjuntar archivos a un mail en PHP ??

Iniciado por Diabliyo, 15 Noviembre 2008, 04:35 AM

0 Miembros y 2 Visitantes están viendo este tema.

Diabliyo

Hola:

Tengo un sistema que envia correos, pero estoy interesado en saber como puedo agregarle un archivo adjunto al correo que deseo enviar ???..

El codigo que utilizo para enviar correos es:

Código (php) [Seleccionar]
function enviar_correo( $to, $asunto, $modo, $enlace )
{
//titulo del correo
$subject=$asunto;

if( $modo==0 ) //enviar correo para comentarios
{
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo= "Han publicado un nuevo comentario en <b>". $_SERVER['HTTP_HOST']. "</b>.<br>Enlace al tema: ";
$cuerpo .= "<b></b><a href=\"". $enlace. "\" target=\"_blank\">". $enlace. "</a></b>";
}
else if( $modo==4 ) //enviar correo de recuperacion de datos del usuario
{
$cuerpo= "<b>Sistema de Recuperacion de Datos.</b>";
$cuerpo .= "<p>Te informamos que hemos obtenido una solicitud de datos de tu cuenta en nuestra pagina <b>". $_SERVER['HTTP_HOST']. "</b>, con motivos de ";
$cuerpo .= "<b>recuperacion de usuario y password</b> dicha solicitud provino de:";
$cuerpo .= "<p>IP: <b>". $_SERVER['REMOTE_ADDR']. "</b><br>";
$cuerpo .= "Nombre Host: <b>";
//obteniendo nombre del host
$info= gethostbyaddr($_SERVER['REMOTE_ADDR']);
if( strcmp( $info, $_SERVER['REMOTE_ADDR']) )
$cuerpo .= $info;
else $cuerpo.= "<b>no se pudo obtener</b>";
unset($info);

$cuerpo .= "</b><br>";
$cuerpo .= "Fecha: <b>". date( "d/m/y", time() ). " a las ". date( "g:i a", time() ). "</b>";
$cuerpo .= "<p>Los datos solicitados referentes a tu cuenta son:";

$x= explode( "|", $enlace );
$cuerpo .= "<p><b>Username: </b>". $x[0];
$cuerpo .= "<br><b>Password: </b>". $x[1];
unset($x);
}
//y mas modos....

//Tag del Robot :: "No contestar al mail"
$cuerpo .= "<p>Este mensaje fue generado automaticmanete por nuestro sistema web, asi que no es necesario contestar este correo.";
$cuerpo .= "<p>". TITULO_WEB. "<br>http://". $_SERVER['HTTP_HOST'];

//cabeceras para enviar correo en formato HTML
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: ". TITULO_WEB. "<robot@sie-group.net>\r\n"; //correo del que lo envia

//funcion para enviar correo
if( mail($to, $subject, $cuerpo, $headers) == FALSE )
return 0;
return 1;
}


Diabliyo


Diabliyo

#3
He ojeado un poco los RFCS's, y lo unico que se me ha ocurrido codificar y que posiblemente funcione es esto:

OJO: Por favor evitense la fatiga de recomendarme software ya programado o librerias, por favor limitense a responder lo que pregunto: "como es posible adjuntar un archivo en un mail enviado por PHP con la funcion mail()" ??

Espero sus criticas a mi code xD... Mas tarde lo testeare, ya que es muy noche y ya me tengo que dormir xD

Código (php) [Seleccionar]
<?php
if( !strcmp($_GET["id"], "enviar") )
{
//titulo del correo
$subject=$_POST["email_asunto"];

//destinatario
$to$_POST["email_dest"];

//contenido o cuerpo
$cuerpo$_POST["email_contenido"];

//cabeceras para enviar correo en formato HTML
$headers="";
$headers"MIME-Version: 1.0\r\n";

//archivos adjuntos
if( strcmp($_FILES["email_file"]["name"], "") ) //si existen archivos adjuntos
{
$archivo$_FILES["email_file"]["name"]; //nombre del archivo
//guardamos el archivo en el directorio actual/raiz
move_uploaded_file$_FILES["email_file"]["tmp_name"], $_FILES["email_file"]["name"] );

echo "Cabeceras de ADJUNTOS<br>"//mensaje como aviso que entramos aqui
//generamos cabezeras para el archivo adjunto
$headers .= "Content-type: application/octet-stream\r\n"//envio directo de datos
//$headers .= "Content-transfer-encoding: base64";
$headers .= "Content-Disposition: attachment; filename="$archivo"\r\n";

$fpfopen$archivo"r" ); //abrimos archivo
$buffread$fpfilesize($archivo) ); //leemos archivo completamente
fclose($fp); //cerramos apuntador;

$headers .= base64_encode($buf); //encriptacion en base64
$headers .= "\r\n"//retorno de carro y salto de linea
}
else
{
//establecemos cabeceras como texto
echo "Cabeceras de TEXTO<br>";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"//datos tipo texto


$headers .= "From: "$_POST["email_src"]. "\r\n"//correo del que lo envia

//funcion para enviar correo
if( mail($to$subject$cuerpo$headers) == FALSE )
echo "Error en el envio...";
else echo "Correo enviado exitosamente...";
}
else
{
echo "<form action=\"mailer_test.php?id=enviar\" method=\"POST\" enctype=\"multipart/form-data\">";
echo "De: <input type=\"text\" name=\"email_src\">";
echo "<br>Para: <input type=\"text\" name=\"email_dest\">";
echo "<br>Asunto: <input type=\"text\" name=\"email_asunto\">";
echo "<p><textarea name=\"email_contenido\"></textarea>";
echo "<p><input type=\"file\" name=\"email_file\">";
echo "<br><input type=\"submit\" value=\"Enviar Mail\">";
echo "</form>";
}
?>

Diabliyo

Listo... Ya tengo mi codigo funcionando :D...

Aqui se los dejo...

Código (php) [Seleccionar]
function enviar_correo( $to, $asunto, $modo, $enlace, $adjunto )
{
$boundary= md5(time()); //valor boundary
$htmlalt_boundary= $boundary. "_htmlalt"; //boundary suplementario
$subject=$asunto; //titulo del correo

//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: ". TITULO_WEB. "<robot@sie-group.net>\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";
//modo de contenido del cuerpo del mensaje a mostrar
//if( !strcmp($modo_envio, "texto") ) //modo texto plano
// {
// $cuerpo .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
// $cuerpo .= "Content-Transfer-Encoding: 8bits\r\n\r\n";
// $cuerpo .= strip_tags(str_replace("<br>", "\n", substr($_POST["email_contenido"], (strpos($_POST["email_contenido"], "<body>")+6)))). "\r\n\r\n";
// }
//else //modo html
// {
$cuerpo .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: 8bits\r\n\r\n";
// }

if( $modo==0 ) //enviar correo para comentarios
{
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo .= "Han publicado un nuevo comentario en <b>". $_SERVER['HTTP_HOST']. "</b>.<br>Enlace al tema: ";
$cuerpo .= "<b></b><a href=\"". $enlace. "\" target=\"_blank\">". $enlace. "</a></b>";
}
//y mas modos....
//....

$cuerpo .= "\r\n\r\n";
$cuerpo .= "--". $htmlalt_boundary. "--\r\n\r\n"; //fin cuerpo mensaje a mostrar

//archivos adjuntos
if( strcmp($adjunto, "0") && strcmp($adjunto, "vacio")  )
{
set_time_limit(600);
$archivo= $adjunto;
$buf_type= obtener_extencion_stream_archivo($adjunto); //obtenemos tipo archivo

$fp= fopen( "uploads/".$archivo, "r" ); //abrimos archivo
$buf= fread( $fp, filesize("uploads/".$archivo) ); //leemos archivo completamente
fclose($fp); //cerramos apuntador;

$cuerpo .= "--". $boundary. "\r\n";
$cuerpo .= "Content-Type: ". $buf_type. "; name=\"". $archivo. "\"\r\n"; //envio directo de datos
$cuerpo .= "Content-Transfer-Encoding: base64\r\n";
$cuerpo .= "Content-Disposition: attachment; filename=\"". $archivo. "\"\r\n\r\n";
$cuerpo .= base64_encode($buf). "\r\n\r\n";
}
$cuerpo .= "--". $boundary. "--\r\n\r\n";

//funcion para enviar correo
set_time_limit(600);
if( mail($to, $subject, $cuerpo, $headers) == FALSE )
return 0;
return 1;
}

дٳŦ٭

Y como adjuntas varios archivos?  :P no entiendo para que regresas 0 y 1...


Con sangre andaluza :)


Diabliyo

Cita de: дٳŦ٭ en 25 Noviembre 2008, 18:43 PM
Y como adjuntas varios archivos?  :P no entiendo para que regresas 0 y 1...

Lo de retornar 1 o 0 en la funcion enviar_correo() es como metodo de comprobacion para saber si el correo se envio o no :D, debido a que esta funcion la utilizo no solo en una parte del codigo, sino que tambien es utilizada para: notificar comentarios nuevos, notificar noticias nuevas, enviar correos a un grupo en especifico, etc, etc... Asi que en momento cuando esta funcion es utilizada para enviar a un conjunto de bandejas, pues no deseo que el programa pierda el tiempo en enviar varios correos, sabiendo de antemano que al primer intento fallido, es mejor detener el ciclo :D...

Sobre adjuntar varios, no lo he investigado :D...

En realidad para saber como adjuntar un archivo, solamente me auto-envie un correo con un PDF adjunto (utilizando GMAIL), de este modo solo observe el mensaje en su fuente original (ver cabeceras y demas info..) y con eso basto para asumir como se armaba con un adjunto ;)..

Cuando desee enviar mas de 1, solamente me auto-enviare 2 archivo, verificare como se genera el mensaje, y listo :D....

bye bye

дٳŦ٭



Con sangre andaluza :)