Foros del Web » Programando para Internet » PHP »

Archivo adjunto en envio de mensaje con php

Estas en el tema de Archivo adjunto en envio de mensaje con php en el foro de PHP en Foros del Web. Bueno mi codigo funciona biense envia el mensaje correctamente ahora necesito un campo tipo file en el formulario para subir y enviar un archivo adjunto ...
  #1 (permalink)  
Antiguo 28/01/2009, 10:21
 
Fecha de Ingreso: febrero-2008
Mensajes: 303
Antigüedad: 16 años, 2 meses
Puntos: 2
Archivo adjunto en envio de mensaje con php

Bueno mi codigo funciona biense envia el mensaje correctamente ahora necesito un campo tipo file en el formulario para subir y enviar un archivo adjunto que debi hacer?
Que debo agregarle a mi codigo php?, hace tiempo no utilizo php y no recuerdo espero se tomen un 1 minuto para ayudarme
form.php
Código PHP:
<html>
<
body>
<
form action="enviar.php" method="POST">
Destinatario<br>
<
input type="text" name="target" size="30" maxlength="30" value=""><p>
Email remitente:<BR>
<
input type="text" name="email" size="20" maxlength="30"><BR>
Título:<BR>
<
input type="text" name="titulo" size="20" maxlength="30"><BR>
Texto del email:<BR>
<
textarea name="mensaje"></textarea>
<
BR>
<
INPUT type="submit" VALUE="Enviar">
</
FORM
</
body>
</
html
enviar.php
Código PHP:
<?
//$nombre= $_POST['nombre'];
$email $_POST['email'];
$titulo$_POST['titulo'];
//$mensaje = $_POST['mensaje'];

$headers "MIME-Version: 1.0 \r\n";  
$headers .= "Content-type: text/html; charset=iso-8859-1 \r\n"
$headers .= "From: $email \r\n";   
//$headers .= "Return-path: $nombre <$email> \r\n"; 
$headers .= "X-Priority: 1 \r\n";  
//$headers .= "X-MSMail-Priority: High \r\n";  
//$headers .= "X-Mailer: PHP/".phpversion()." \n";

$mensaje 'CONTENIDO DE MI MENSAJE';
if (isset(
$email)):
# la dirección electrónica a la que enviar el email
$target$_POST['target'];

mail($target,$titulo,$mensaje,$headers);
endif;
?>
saludos
  #2 (permalink)  
Antiguo 28/01/2009, 10:24
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 1 mes
Puntos: 67
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Esto te puede servir:

http://blog.unijimpe.net/enviar-email-con-adjuntos/
  #3 (permalink)  
Antiguo 28/01/2009, 10:50
 
Fecha de Ingreso: febrero-2008
Mensajes: 303
Antigüedad: 16 años, 2 meses
Puntos: 2
la clase php mailer! bueno solo queria agregarle un par de lineas a mi codigo, seguire con google a ver si recuerdo

saludos

No encuentro ningun ejemplo alguien me puede ayudar

saludos

Última edición por GatorV; 28/01/2009 a las 14:15
  #4 (permalink)  
Antiguo 28/01/2009, 12:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

http://www.forosdelweb.com/1072303-post144.html

Siempre lee las FAQs la mayoria de las respuestas estan ahí.

Saludos
  #5 (permalink)  
Antiguo 28/01/2009, 13:53
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Yo no quiero utilizar la clase phpMailer(tendria que explicar como funcionan las clases), necesito algo rustico como esto, pero no entiendo el codigo esta bien liado.

Espero alguien me ayude!

saludos

Última edición por franko1809; 28/01/2009 a las 15:14
  #6 (permalink)  
Antiguo 28/01/2009, 14:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

El problema es que si lo haces de forma "rustica" tienes que codificar el email y creo es un poco más complicado si no conoces el RCF 822 que especifica como se debe de codificar el email y que partes deben de ser enviadas.

Saludos
  #7 (permalink)  
Antiguo 28/01/2009, 14:46
Avatar de ElJavista
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: Lima Perú
Mensajes: 2.231
Antigüedad: 17 años, 1 mes
Puntos: 67
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Usa mejor la clase phpMailer, por experiencia te digo que adjuntar archivos usando la función mail es de lo más complicado. Usar phpMailer es lo más simple que hay, sólo íntentalo, sigue el manual que te he dado, no tengas miedo, verás que no es tan complicado.
  #8 (permalink)  
Antiguo 28/01/2009, 15:16
 
Fecha de Ingreso: febrero-2008
Mensajes: 303
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

siguiendo el codigo de Eljavista
http://blog.unijimpe.net/enviar-email-con-adjuntos/

Me sale un error, supongo por que el codigo fue hecho en el 2007 y solo he encontrado la clase phpmailer version 2009, necesitaba algo rapido y a estas alturas estoy con la clase phpmailer y con tremendo error

Código:
Warning: set_time_limit() has been disabled for security reasons in /home/a7760491/public_html/class.phpmailer.php on line 692
Alguien me puede proporcionar la clase phpmailer que corra con ese ejemplo o algun codigo simple como este

  #9 (permalink)  
Antiguo 28/01/2009, 15:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Ese error te indica que set_time_limit esta desactivado, por seguridad, busca dentro de la clase PHPMailer y comenta esa linea, aunque no se que tanto dependa el code de eso.

Saludos
  #10 (permalink)  
Antiguo 28/01/2009, 17:25
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Bueno habia 2 errores solo mencione 1 y ya se soluciono comentando esa linea.

El otro error es este:

Código:
Fatal error: Class 'PHPMailer' not found in /home/a7760491/public_html/class.phpmailer.php on line 1330
Por otro lado para usar phpmailer hay q tener una configucacion especial del php.ini?, quizas sea eso, tambien este archivo no puede ser modificado en un hosting gratis
  #11 (permalink)  
Antiguo 28/01/2009, 22:01
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Les incluyo lo necesario para adjuntar un archivo ->
AL INICIO DEBE IR EL CORREO DESTINO, EL ASUNTO Y EL MENSAJE!!!.
AL FINAL DEBE IR mail($correo, $asunto, $mensaje, $headers);
Cita:
$headers = "From: [email protected]\n";
$headers .= "Reply-To: [email protected]\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"MIME_BOUNDRY\"\n";
$headers .= "This is a multi-part message in MIME format.\n";

$fp = fopen(($_FILES['miarchivo']['tmp_name']),"r");
$str = fread($fp, filesize($_FILES['miarchivo']['tmp_name']));
$str = chunk_split(base64_encode($str));
$fp = fclose($fp);


$message = "--MIME_BOUNDRY\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "\n";
$message .= "$mensaje";
$message .= "\n";

$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/octet-stream; name=\"nuevo.txt\"\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";
Comentarios ->
1.- se define el hecho que el correo contendra varias fronteras MIME (MIME BOUNDRY).
2.- se toma el archivo proveniente de un upload o en su defecto del directorio o ruta donde fisicamente se encuentra el archivo, se codifica con la funcion base64_encode.
3.- se define la primera frontera del correo que involucra el mensaje que en este caso es de contenido text/plain, utiliza los charset (iso-8859-1 o bien puede ser utf... y se establece que es "quoted-printable".
4.- se establece la ultima frontera que contiene el archivo adjunto definido por $str con contenido application/octet-stream (que es para archivos de texto y debera variar segun el archivo que se envie, para imagenes jpg seria image/jpeg, etc).
Se establece su disposicion a ser un adjunto; es decir que debe ser tomado como adjunto cuando el servidor de correo del destinatario lo reciba y se debe indicar lo a la funcion que se utilizo para codificar el archivo, que en este caso es base64.

Asi termina el codigo
Saludos
Franco

P.S. No omito manifestar que el tipo de archivo es necesario saberlo para poder establecer los content-type que se enviaran en la cabecera del correo; esto es muy importante y para generalizar el codigo pueden hacer algo asi ->
if($type == "image/gif") {
$message .= "Content-Type: image/gif \n";
etc etc etc...
}
  #12 (permalink)  
Antiguo 28/01/2009, 22:38
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

Tio no logro adjuntar el archivo le puse un campo file de nombre miarchivo y tambien en la misma carpeta cree un archivo llamado nuevo.txt y se envia correctamente pero no se adjunta nada

Código PHP:
<?
$correo
="[email protected]";
$asunto="Asunto del mensaje";
$mensaje="Contenido del mensaje";
//$headers

$headers "From: [email protected]\n";
$headers .= "Reply-To: [email protected]\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"MIME_BOUNDRY\"\n";
$headers .= "Este es un mensaje multi-part en formato MIME.\n";

$fp fopen(($_FILES['miarchivo']['tmp_name']),"r");
$str fread($fpfilesize($_FILES['miarchivo']['tmp_name']));
$str chunk_split(base64_encode($str));
$fp fclose($fp);


$message "--MIME_BOUNDRY\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "\n";
$message .= "$mensaje";
$message .= "\n";

$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/octet-stream; name=\"nuevo.txt\"\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";

mail($correo$asunto$mensaje$headers);

?>
Quizas sea la hora y el cansancio mañana lo revisare con calma pero si encuentras el error me avisas
  #13 (permalink)  
Antiguo 28/01/2009, 22:44
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

franko1809:

No dudo del cansancio, aunque solo asi se logran cosas buenas;

Cita:
$message = "--MIME_BOUNDRY\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "\n";
$message .= "$mensaje";
$message .= "\n";

$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/octet-stream; name=\"nuevo.txt\"\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";
NO COINCIDE CON ->

Cita:
mail($correo, $asunto, $mensaje, $headers);
Uno esta en Gringo lenguaje el otro en Español!!!
Es decir el mensaje esta mal escrito:
Cambia $mensaje de mail() por $message de gringolandia.

Saludos
Franco
  #14 (permalink)  
Antiguo 29/01/2009, 14:42
 
Fecha de Ingreso: febrero-2008
Mensajes: 303
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Archivo adjunto en envio de mensaje con php - urgente!

gracias tio funciona bien dejo el codigo por si a alguien le sirve
Código PHP:
<html>
<
body>
<
form action="1.php" method="POST" enctype="multipart/form-data">
   
Destinatario<br>
   <
input type="text" name="destino" size="30" maxlength="30" value=""><BR>
   
Título:<BR>
   <
input type="text" name="titulo" size="20" maxlength="30"><BR>
   
Contenido del mensaje:<BR>
   <
input type="text" name="contenido" size="20" maxlength="30"><BR>
   
Adjunto:<br
   <
input type="file" name="miarchivo"><BR>
   <
INPUT type="submit" VALUE="Enviar">
</
form
</
body>
</
html
Código PHP:
<?
//Recuperamos los datos del form
$correo $_POST['destino'];
$asunto $_POST['titulo'];
$mensaje $_POST['contenido'];
$nom_archivo $_FILES['miarchivo']['name'];   //nombre del archivo adjunto


$headers "From: [email protected]\n";
$headers .= "Reply-To: [email protected]\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"MIME_BOUNDRY\"\n";
$headers .= "Este es un mensaje multi-part en formato MIME.\n";

$fp fopen(($_FILES['miarchivo']['tmp_name']),"r");
$str fread($fpfilesize($_FILES['miarchivo']['tmp_name']));
$str chunk_split(base64_encode($str));
$fp fclose($fp);


$message "--MIME_BOUNDRY\n";
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "\n";
$message .= "$mensaje";
$message .= "\n";

$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/octet-stream; name=\"$nom_archivo\"\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";

mail($correo$asunto$message$headers);
echo 
$nom_archivo;
?>
Lo unico que falta es que cuando el campo tipo file del form este vacio no adjunte nada por que sale un error, pero igual se envia el mensaje.

Por otro lado sobre el Content-Type puedo adjuntar archivos .txt .zip .doc .jpg y seguro todos los demas no se a que se deba aqui esta la linea
Código PHP:
$message .= "Content-Type: application/octet-stream; name=\"$nom_archivo\"\n"
Supuestamente el application/octet-stream solo debe cargar archivos .txt

En fin ya tengo lo que necesitaba pero si alguien quiere explicar sobre eso estaria bueno o quizas yo estoy equivocado

saludos
  #15 (permalink)  
Antiguo 29/01/2009, 19:17
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Archivo adjunto en envio de mensaje con php

KingColt:

En este caso especifico fue un archivo de texto.
Para ampliar la cobertura de este codigo a por ejemplo
archivo de imagen como .jpeg entonces debes hacer lo siguiente ->

Cita:
$message .= "--MIME_BOUNDRY\n";
$message .= "Content-Type: application/octet-stream; name=\"$nom_archivo\"\n";
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";
Pasas el nombre completo del archivo via una variable del tipo
$nom_archivo y si es una imagen .GIF debes rehacer el codigo asi ->

Cita:
$message .= "--MIME_BOUNDRY\n";
if($tipo_archivo == "image/gif") {
$message .= "Content-Type: image/gif; name=\"$nom_archivo\"\n";
}
$message .= "Content-disposition: attachment\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= "$str\n";
$message .= "\n";
$message .= "--MIME_BOUNDRY--\n";
De la misma manera procedes con otros tipos de archivo incluyendo un if y el MIME type que le corresponda.
Es decir debes conocer el MIME tipe de cada archivo que vas a adjuntar lo que puedes capturar desde el upload o por otros medios.

Saludos
Franco
  #16 (permalink)  
Antiguo 20/03/2009, 15:15
 
Fecha de Ingreso: mayo-2008
Ubicación: Caracas
Mensajes: 33
Antigüedad: 15 años, 11 meses
Puntos: 0
De acuerdo Respuesta: Archivo adjunto en envio de mensaje con php

Gracias, me fue de ayuda este post
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 10:10.