Autor
|
Tema: [SOLUCIONADO] Como adjuntar archivos a un mail en PHP ?? (Leído 27,045 veces)
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
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: 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 if( strcmp( $info, $_SERVER['REMOTE_ADDR']) ) $cuerpo .= $info; else $cuerpo.= "<b>no se pudo obtener</b>"; $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:"; $cuerpo .= "<p><b>Username: </b>". $x[0]; $cuerpo .= "<br><b>Password: </b>". $x[1]; } //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; }
|
|
« Última modificación: 25 Noviembre 2008, 15:44 pm por Diabliyo »
|
En línea
|
|
|
|
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
Desconectado
Mensajes: 5.110
|
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
No deseo usar librerias externas !!... Alguien por favor que sepa como enviar adjuntos sin utilizar librerias externas ??.. bye bye
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
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 <?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 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"; $fp= fopen( $archivo, "r" ); //abrimos archivo $buf= fread( $fp, filesize($archivo) ); //leemos archivo completamente fclose($fp); //cerramos apuntador; $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>"; } ?>
|
|
« Última modificación: 17 Noviembre 2008, 17:32 pm por Diabliyo »
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Listo... Ya tengo mi codigo funcionando ... Aqui se los dejo... 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 { $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 .= "--". $boundary. "--\r\n\r\n"; //funcion para enviar correo if( mail($to, $subject, $cuerpo, $headers) == FALSE ) return 0; return 1; }
|
|
|
En línea
|
|
|
|
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
Desconectado
Mensajes: 5.110
|
Y como adjuntas varios archivos? no entiendo para que regresas 0 y 1...
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Y como adjuntas varios archivos? 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 , 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 ... Sobre adjuntar varios, no lo he investigado ... 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 .... bye bye
|
|
|
En línea
|
|
|
|
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
Desconectado
Mensajes: 5.110
|
Pues metelos en un array, es facil... bye bye
|
|
|
En línea
|
|
|
|
|
|