Nueva pregunta

Pregunta:

Fecha: 01-07-2016 12:09:10 (En Español)

Enviar email desde PHP con archivo adjunto[Resuelta]

Problema resuelto, el código HTML y PHP aquí abajo(actualizados) son los que use para mandar los datos del form a un correo electronico con un archivo adjunto.

--------------------------------------------------------------------------

Buenas, estoy queriendo enviar un archivo adjunto, desde mi formulario;


- CODIGO HTML:
<form name="htmlform" method="post" action="addons/contact_form_send.php" enctype="multipart/form-data">
    <div class="field">	
        <div class="label-form">
            <input type="text" name="nombre" placeholder="Razon Social (requerido)"  maxlength="50" size="30" required>
        </div>
    </div>
    <div class="field">	
        <div class="label-form">
            <input type="number" name="ruc" placeholder="N° de RUC"  maxlength="50" size="30" required>
        </div>
    </div>
    <div class="field">
        <div class="label-form">
            <input type="email" name="email" placeholder="Ingresa tu Email (requerido)"  maxlength="80" size="30" required>
        </div>
    </div>
    <div class="field">	
        <div class="label-form">
            <input type="tel" name="telefono" placeholder="Telefono de contacto (requerido)" maxlength="50" size="30" required>
        </div>
    </div>
    <div class="field">
        <div class="label-form">
            <input type="text" name="cargo" placeholder="Cargo"  maxlength="50" size="30" required>
        </div>	
    </div>
    <div class="field">	
        <div class="label-form">
            <input type="text" name="producto"  placeholder="Producto a cotizar"  maxlength="50" size="30" required>
        </div>
    </div>
    <div class="field">	
        <div class="label-form">

            <input type="number" name="cantidad"  placeholder="Cantidad"   size="30" required>
        </div>
    </div>
    <div class="field">	
        <div class="label-form">
            <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
            <input type="file" name="archivo" id="archivo" placeholder=""  size="30" required>
        </div>
    </div>
    <div class="field">
        <div class="label-form">
            <textarea name="mensaje" placeholder="Escriba su mensaje" maxlength="1000" cols="25" rows="6" required></textarea>
        </div>
    </div>
    <div class="field submit">
        <button type="submit" class="btn2 btn-2 mbottom60" tabindex="5">Solicitar cotización</button>
    </div>					
</form>


- CODIGO PHP:
<?php
if(isset($_POST['email'])) {
     
    //Para y asunto del mensaje a enviar
    $email_to = "stone.free.irie@gmail.com"; 
    $email_subject = "Email desde cotizador de pagina Web";
     
     
    function died($error) {
       
        echo "Lo sentimos mucho, pero hubo un error(es) encontrado en el formulario que se quizo cotizar. ";
        echo "Estos son los errores:<br /><br />";
        echo $error."<br /><br />";
        echo "Retroceda y arregle el error.<br /><br />";
        die();
    }
     
    // validation expected data exists
    
    if(!isset($_POST['nombre']) ||
        !isset($_POST['ruc']) ||
        !isset($_POST['email']) ||
        !isset($_POST['telefono']) ||
        !isset($_POST['cargo']) ||
        !isset($_POST['producto']) ||
        !isset($_POST['cantidad'])||
        !isset($_FILES['archivo']['name'])||
        !isset($_POST['mensaje'])){
        died('Lo sentimos, pero hubo un error(es) encontrado en el formulario que se quizo cotizar.');       
    }
     
    
    //variables para los campos
    $nombre = $_POST['nombre']; // required
    $ruc = $_POST['ruc']; // required
    $email_from = $_POST['email']; // required
    $telefono = $_POST['telefono']; // required
    $cargo = $_POST['cargo']; // required
    $producto = $_POST['producto']; // required
    $cantidad = $_POST['cantidad']; // required
    $mensaje = $_POST['mensaje']; // required
        
   // print_r("var1: ".$nombreArchivo." var2:".$tamanioArchivo."  var3:".$tipoArchivo."  var4:".$tempArchivo);exit;
     //print_r($_FILES);exit;
    $error_message = "";
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
    $string_exp = "/^[A-Za-z .'-]+$/";
    
  if(!preg_match($email_exp,$email_from)) {
    $error_message .= 'El email que ingresaste no parece ser válido. <br />';
  }
  if(!preg_match($string_exp,$nombre)) {
    $error_message .= 'El nombre que ingresaste no parece ser válido. <br />';
  }
  if(!preg_match($string_exp,$cargo)) {
    $error_message .= 'El cargo que ingresaste no parece ser válido<br />';
  }
  if(strlen($mensaje) < 2) {
    $error_message .= 'El mensaje que ingresaste no parece ser válido<br />';
  }
  if(strlen($error_message) > 0) {
    died($error_message);
  }
     
    
    
    //variables para los datos del archivo 
    $nombrearchivo = $_FILES['archivo']['name'];
    $archivo = $_FILES['archivo']['tmp_name'];

    // Leemos el archivo a adjuntar
    
    $archivo = file_get_contents($archivo);
    $archivo = chunk_split(base64_encode($archivo));
     
    
     
// create email headers

      /*$headers = "MIME-Version: 1.0\r\n";
      $headers .= "Content-type: multipart/mixed;";
      $headers .= "boundary=\"=A=G=R=O=\"\r\n";
      $headers .= "From : ".$email_from."\r\n"; */
     

        function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
    
    
     // Cuerpo del Email
    $CuerpoMensaje .= "A continuación más detalles:\r\n\r\n";
    $CuerpoMensaje .= "<b>Nombre:</b> ".clean_string($nombre)."\r\n";
    $CuerpoMensaje .= "<b>RUC:</b> ".clean_string($ruc)."\r\n";
    $CuerpoMensaje .= "<b>Email:</b> ".clean_string($email_from)."\r\n";    
    $CuerpoMensaje .= "<b>Telefono:</b> ".clean_string($telefono)."\r\n";
    $CuerpoMensaje .= "<b>Cargo:</b> ".clean_string($cargo)."\r\n";
    $CuerpoMensaje .= "<b>Producto:</b> ".clean_string($producto)."\r\n";
    $CuerpoMensaje .= "<b>Cantidad:</b> ".clean_string($cantidad)."\r\n";
    $CuerpoMensaje .= "<b>Mensaje:</b> ".clean_string($mensaje)."\r\n";
      
    
     //cabecera del email (forma correcta de codificarla)
    $headers = "From: Globalcolor WEB <" . $email_from . ">\r\n";
    //$header .= "Reply-To: " . $replyto . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"=A=G=R=O=\"\r\n\r\n";
    
    
    //armando mensaje del email
    $email_message = "--=A=G=R=O=\r\n";
    $email_message .= "Content-type:text/plain; charset=utf-8\r\n";
    $email_message .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $email_message .= $CuerpoMensaje . "\r\n\r\n";
    
    //archivo adjunto  para email    
    $email_message .= "--=A=G=R=O=\r\n";
    $email_message .= "Content-Type: application/octet-stream; name=\"" . $nombrearchivo . "\"\r\n";
    $email_message .= "Content-Transfer-Encoding: base64\r\n";
    $email_message .= "Content-Disposition: attachment; filename=\"" . $nombrearchivo . "\"\r\n\r\n";
    $email_message .= $archivo . "\r\n\r\n";
    $email_message .= "--=A=G=R=O=--";
    
    
    
    //enviamos el email
    mail($email_to, $email_subject, $email_message, $headers);
    
    

}
    
    
?>
 
 
<!doctype html>...</html>
 
 
 
 
<?php

die();
?>


Pero no me esta llegando el correo al enviar, imprimo las variables que queiro mandar al email, el navegador me indica que se esta subiendo el archivo, me lleva al html, mas el correo no me llega, no se que estoy haciendo mal :/
Etiquetas: Email - Formulario - HTML5 - PHP - PHP Avanzado - Pregunta - Subir Archivos (Upload) Votos: 2 - Respuestas: 15 - Vistas: 55 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 01-07-2016 14:51:36 Por encima, se ve todo bien.

    Imprime estas 4 variables en el HTML y así compruebas que estén llegando los valores correctos (y además que haya entrado correctamente en el IF):

    $email_to, $email_subject, $email_message, $headers

    También elimina el "die()" al final. No hace falta...
      Votos: 3 - Link respuesta
     
  • Fecha: 04-07-2016 07:31:20 Hola Daniel, me parece muy interesante este tema y la forma en que planteas tu pregunta (con el código de ejemplo y todo, excelente +1) por lo que me di a la tarea de armarte un ejemplo 100% funcional, en el mismo se indica un email destinatario y se adjunta un archivo a ser enviado. Las validaciones del ejemplo son básicas, claro esta que lo que intento mostrarte es el envío del archivo adjunto sin complejizar el código.

    Observa como confecciono el header y el cuerpo del mensaje, también como he simplificado el trabajo con el archivo por medio de la función "file_get_contents()".

    Sin más preámbulo, aquí el código:
    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') { //solo ingreso a este bloque de código si el método con el que solicita la página es POST
    
        $tiempoEspera = 3; //tiempo de espera para recargar la página (aplicado en la lógica de refresh)
    
        if (!isset($_POST['emaildestino'])) { //validación basica del campo email
            echo 'El email del destinatario es requerido, la página será recargada en ' . $tiempoEspera . ' segundos.';
            echo '<meta http-equiv="refresh" content="' . $tiempoEspera . '">';
            exit();
        }
    
        if (!isset($_FILES['archivo']) || !isset($_FILES['archivo']['tmp_name']) || strlen($_FILES['archivo']['tmp_name']) < 3) { //validación básica del campo "archivo adjunto"
            echo 'El archivo a ser enviado es requerido, la página será recargada en ' . $tiempoEspera . ' segundos.';
            echo '<meta http-equiv="refresh" content="' . $tiempoEspera . '">';
            exit();
        }
    
        $origenNombre = 'PHPCentral.com'; //nombre que visualiza el receptor del email como "origen" del email (es quien envía el email)
        $origenEmail = 'noreply@phpcentral.com';//email que visualiza el receptor del email como "origen" del email (es quien envía el email)
        $destinatarioEmail = $_POST['emaildestino']; //destinatario del email, o sea, a quien le estamos enviando el email
        $archivoNombre = $_FILES['archivo']['name']; //nombre del archivo a ser enviado (sin la ruta, solo el nombre con la extensión, por ejemplo: imagen.jpg)
        $archivo = $_FILES['archivo']['tmp_name']; //ruta temporal del archivo a ser adjuntado (ubicación fisica del archivo subido en el servidor)
        $archivo = file_get_contents($archivo); //leeo del origen temporal el archivo y lo guardo como un string en la misma variable (piso la variable $archivo que antes contenía la ruta con el string del archivo)
        $archivo = chunk_split(base64_encode($archivo)); //codifico el string leido del archivo en base64 y la fragmento segun RFC 2045
        $uid = md5(uniqid(time())); //frabrico un ID único que usaré para el "boundary"
        
        $asuntoEmail = 'Archivo adjunto'; //asunto del email
        
        //cuerpo del email:
        $cuerpoMensaje = "Este es el cuerpo del email\r\n";
        $cuerpoMensaje .= "Esta es la segunda línea del cuerpod\r\n";
        $cuerpoMensaje .= "Tercera línea\r\n";
        $cuerpoMensaje .= "Etc...\r\n";
        //fin cuerpo del email.
        
        //cabecera del email (forma correcta de codificarla)
        $header = "From: " . $origenNombre . " <" . $origenEmail . ">\r\n";
        $header .= "Reply-To: " . $origenEmail . "\r\n";
        $header .= "MIME-Version: 1.0\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
    
        //armado del mensaje y attachment
        $mensaje = "--" . $uid . "\r\n";
        $mensaje .= "Content-type:text/plain; charset=utf-8\r\n";
        $mensaje .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $mensaje .= $cuerpoMensaje . "\r\n\r\n";
        $mensaje .= "--" . $uid . "\r\n";
        $mensaje .= "Content-Type: application/octet-stream; name=\"" . $archivoNombre . "\"\r\n";
        $mensaje .= "Content-Transfer-Encoding: base64\r\n";
        $mensaje .= "Content-Disposition: attachment; filename=\"" . $archivoNombre . "\"\r\n\r\n";
        $mensaje .= $archivo . "\r\n\r\n";
        $mensaje .= "--" . $uid . "--";
    
        //envio el email y verifico la respuesta de la función "email" (true o false)
        if (mail($destinatarioEmail, $asuntoEmail, $mensaje, $header)) {
            echo 'El archivo fue enviado correctamente';
        } else {
            echo 'Error, no se pudo enviar el email';
        }
        echo ', la página será recargada en ' . $tiempoEspera . ' segundos.';
        echo '<meta http-equiv="refresh" content="' . $tiempoEspera . '">';
        exit();
    }
    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style type="text/css">
                label, input{
                    display: block;
                }
                input{
                    margin-bottom: 20px;
                }
                input[type="email"]{
                    margin-bottom: 20px;
                    padding: 5px;
                    font-size: 16px;
                    width: 270px;
                }
                input[type="submit"]{
                    background-color: #4caf50;
                    border-radius: 5px;
                    padding: 5px 10px;
                    color: #ffffff;
                    cursor: pointer;
                    font-size: 16px;
                    border: none;
                }
                input[type="submit"]:hover{
                    background-color: #2f9233;
                }
            </style>
        </head>
        <body>
            <form method="POST" enctype="multipart/form-data">
                <h2>Enviar archivo adjunto</h2>
                <label>Email destinatario:</label>
                <input type="email" name="emaildestino"/>
                <label>Seleccione un archivo:</label>
                <input type="file" name="archivo" />
                <input type="submit" value="Enviar Archivo"/>
            </form>
        </body>
    </html>
    


    Espero que mi ejemplo te sea de ayuda.

    Saludos y buen código!
      Votos: 7 - Link respuesta
     
  • Fecha: 04-07-2016 12:11:41 Hola, Fernando, atendi algunos puntos en el codigo, segun tu ejm, pero aun sigo sin que me llegue el correo electronico, he actualizado los codigos de la pregunta hecha aqui. gracias por responder   Votos: 1 - Link respuesta
     
  • Fecha: 04-07-2016 13:04:17 Hola Daniel, acabo de modificar mi código de ejemplo agregando un cuerpo de email de prueba, los datos de origen (email y nombre) y comentarios sobre que hago en cada línea.

    El ejemplo esta más que probado, por lo que aquí te pediría que subas el ejemplo a tu servidor y veas si te funciona tal cual esta, o sea, pones todo el código de ejemplo en un "prueba.php" y lo ejecutas en tu servidor, y nos cuentas como te fue..., si no te funciona hay que buscar el problema por el lado del servidor, si te funciona corretamente el problema esta en tu código.

    Para serte sincero, no me he puesto a analizar línea por línea tu código para encontrar el error, creo que esta es una tarea que debes hacer tu comparando con el ejemplo que te doy (que valga la redundancia, esta 100% completo y aplica perfecto a lo que tu quieres hacer).

    Nirando muy por arriba tu código veo algunos puntos, observa la línea 114 y 117, el nombre del archivo debería estar encerrado entre comillas dobles (" "), intente modificar estas líneas:

    114 original:
    $email_message .= "Name=". $nombrearchivo . "\r\n";

    114 modificada:
    $email_message .= "Name=\"". $nombrearchivo . "\"\r\n";


    117 original:
    $email_message .= "filename=" . $nombrearchivo . "\r\n";

    117 modificada:
    $email_message .= "filename=\"" . $nombrearchivo . "\"\r\n";


    Espero que mi respuesta te sea de ayuda, saludos!
      Votos: 4 - Link respuesta
     
  • Fecha: 05-07-2016 11:16:42 Fernando, buenas,

    estoy a media prueba del codigo, al parecer mi php estaba mal, ya que tu ejemplo funciona perfectamente... Gracias por ello. Por otro lado, veo en la 2da linea del header para el email una variable que no comprendo de donde aparece xd

    cabecera de email
    .
    $header .= "Reply-To: " . $replyto . "\r\n";
    .
    .
    


    La variable $replyto.

    aún probare quitando y poniendo otra cosa, gracias de ante mano, MAESTRO! haha saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 05-07-2016 11:56:34 Fernando Mosquera, eres un lobo, gracias, estudie los codigos, y por fin me salio como queria, gracias, enserio muchas gracias. Te ganaste tu cevichito cuando vengas a Perú jaja. Saludos y otra vez gracias. Arreglare la pregunta para que si alguien la lee pueda verificar el codigo que use ^^.   Votos: 1 - Link respuesta
     
  • Fecha: 05-07-2016 12:20:38 Hola Daniel, muchas gracias por tus palabras, me pone muy contento saber que he podido ayudarte... Todavía no he tenido el placer de visitar Perú, pero si tengo pendiente el viaje a Cusco (quisiera conocer las ruinas del machu pichu), pero no creo que suceda en el corto plazo...

    Con respecto a la línea 38 de mi ejemplo, la variable "$replyto" se corresponde con el email que sugiere el sistema al querer responder el email original, o sea, quien recibe el email y presiona en "responde" automáticamente se completa el destinatario con dicho email. Tipicamente dicha variable contiene la misma dirección de email con la que se envía el email, por lo que ajuste el ejemplo remplazando la variable $replyto por $origenEmail; (esta fue una omisión al "castellanizar" el código, que por lo general suelo escribir en lenguaje ingles).

    La líne queda así:
        $header .= "Reply-To: " . $origenEmail . "\r\n";


    Saludos y buen código!
      Votos: 1 - Link respuesta
     
  • Fecha: 04-09-2016 18:39:34 Hola estimados muy buen artículo, copie el de Fernando y en local al hacer click en enviar archivo dice:

    "El archivo fue enviado correctamente, la página será recargada en 3 segundos." pero no envía nada..


    Lo subí a la web y al hacer click en enviar archivo aparece:

    "Error, no se pudo enviar el email, la página será recargada en 3 segundos." y tampoco manda nada :(
      Votos: 1 - Link respuesta
     
  • Fecha: 05-09-2016 01:01:47 Hola Anibal, el código que expongo hace uso de la función nativa de PHP mail() para hacer los envios, y para que esta funcione debe estar correctamente configurada en el servidor. Por lo general en local no te va a funcionar, si en un servidor online (aunque algunos servidores gratuitos la deshabilitan para evitar que sus servidores "free" sean usados para hacer spam).

    Prueba hacer un script simple con la función mail() para verificar si es este es o no el problema.

    Por ejemplo:
    <?php
    if(mail("xxxxxxx@xxxxxxx.com","Formulario recibido","prueba")){
        echo 'envio ok';
    } else {
        echo 'error';
    }
    ?>
    


    Saludos y buen código!
      Votos: 2 - Link respuesta
     
  •  
      0  
     
    Fecha: 25-09-2017 22:46:23 Revivo este post porque me surge una duda, Si quisiera adjuntar varios archivos?, sin saber cuantos?

    Como se haría?

    Yo lo estoy haciendo mediante una clase pero me falla siempre.

    Copio el código compañeros.

    class Email {
        
    	//Propiedades
        private $to 		 = array();
    	private $cc 		 = array();
        private $bCc 		 = array();
    	private $from 		 = NULL;
    	private $subject 	 = NULL;
    	private $body 		 = NULL;
    	private $contentType = 'html';
    	
    	
    	public $adjuntos = array();
    	public $charSet  = 'UTF-8';
    	
        
    	//Constructor
        public function __construct(){        
            
        }
    	
    	//Establece el tipo de contenido a texto plano
    	public function isPlain(){
            $this->contentType= 'plain';
        }
    	
    	//Setea quien envía el correo
        public function setFrom($email, $name = NULL){        
            if ($name !== NULL) {
                $stFrom = trim($name) . ' <' . trim($email) . '>';
            } else {
                $stFrom = $email;
            }
            $this->from = $stFrom;
        }
        
    	//Setea al asunto
        public function setSubject($subject){
            $this->subject = trim($subject);
        }
    
    	//Setea el contenido del correo
        public function setBody($body){
            $this->body = $body;
        }
        
    	//Añade otra dirección más al envío
        private function addAddress($email, $destType, $name = NULL){
            if ($name !== NULL) {
                $stTo = trim($name) . ' <' . trim($email) . '>';
            } else {
                $stTo = $email;
            }        
            $this->{$destType}[] = $stTo;        
        }
    	
    	//Adjuntar archivos
    	public function adjuntarArchivo($archivo){
    		$this->adjuntos[] = $archivo;
    	}
    	
    	//Setea a quien se le envía
        public function addTo($email, $name = NULL){                
            $this->addAddress($email, 'to', $name); 
        }
        
    	//Añade una dirección de copia
        public function addCC($email, $name = NULL){        
            $this->addAddress($email, 'cc', $name);
        }
        
    	//Añade dirección de copia oculta
        public function addBCC($email, $name = NULL){        
            $this->addAddress($email, 'bCc', $name);
        }
    
    	//Envia el correo
        public function send(){    
            $stErros = '';   
    		     
            if($this->from === NULL){
                $stErros .= '<li>Falta el campo FROM.</li>';
            }
            if(count($this->to) === 0){
                $stErros .= '<li>Falta al menos un destinatario</li>';
            }
            if($this->subject === NULL){
                $stErros .= '<li>Falta el asunto del mensaje</li>';
            }        
            if($this->body === NULL){
                $stErros .= '<li>Falta el contenido del mensaje</li>';
            }        
            if($stErros !== ''){
                //throw new Exception('Email error(es): <ul>' . $stErros . '</ul>');
    			$stErros = '<ul>'.$stErros.'</ul>';
            }
            
            $headers = array();
        
    		//$boundary = rand(0,9)."-".rand(10000000000,9999999999)."-".rand(10000000000,9999999999)."=:".rand(10000,99999);
    		$boundary='didondinaditondelosdudosdodudundodudindon';
    		
    		//Si NO lleva adjuntos
    		if(count($this->adjuntos) == 0){
    			$headers[] = "MIME-Version: 1.0";
            	$headers[] = "Content-type: text/{$this->contentType}; charset={$this->charSet}";         
    		//Si lleva adjuntos
    		}else{
    			$headers[] = "MIME-Version: 1.0\r\n";
    			$headers[] = "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";
    		}
            $headers[] = "From: {$this->from}"; 
            
            if(count($this->cc) > 0){
                foreach($this->cc as $bCc){
                    $headers[] = 'Cc: ' . $bCc;
                }         
            }
            if(count($this->bCc) > 0){
                foreach($this->bCc as $bCc){
                    $headers[] = 'Bcc: ' . $bCc;
                }         
            }
            
            $stTo = implode(", ", $this->to);
            $stHeaders = implode("\r\n", $headers);
            
            if($this->contentType === 'html'){
    			
    			if(count($this->adjuntos) == 0){
    				$body  = '<html><head><title>'.$this->subject.'</title><meta http-equiv=Content-Type content=text/html; charset=UTF-8>';
    				$body .= '</head><body><table width="960" border="0"><tr><td><p align="justify" style="color:#000000;">';
    				$body .=  nl2br($this->body); 
    			}else{
    				
    				$body  = "--".$boundary."\n";
    				$body .= "Content-Type: text/html; charset=ISO-8859-1\r\n\n";
    				$body .= '<html><head><title>'.$this->subject.'</title><meta http-equiv=Content-Type content=text/html; charset=UTF-8>';
    				$body .= '</head><body><table width="960" border="0"><tr><td><p align="justify" style="color:#000000;">';
    				
    				foreach($this->adjuntos as $value){
    					$body .= $body . "--" . $boundary . "\n";
    					$body .= "Content-Type: ".$value."; name=\"".$value."\"\r\n"; 	
    					$body .= "Content-Transfer-Encoding: base64\r\n";
    					$body .= "Content-Disposition: attachment; filename=\"".$value."\"\r\n\n";
    					$body .= chunk_split(base64_encode($archivo)) . "\r\n\r\n";
    				}
    			}
                $body .= "--" . $boundary ."--";
    			
    			$body .= '</p></td></tr></table></body></html>';
    			
            }else{
                $body = $this->body;
            }
    		
    		if($stErros == ''){
    			$boSend = mail($stTo, $this->subject, $body, $stHeaders);
    			 if(!$boSend){
    				//throw new Exception('Email falla -> '.$boSend );
    				$stErros .= 'Falla el envío del correo.'.$headers.$body;
    			} else{
    				//$this->clearAllRecipients();
    				$stErros = 1;
    			}
    		}
    		return $stErros;
        }
      
      	// Limpiar enviados
        public function clearAllRecipients(){
            $this->to = array();
            $this->cc = array();
            $this->bCc = array();
        }
    
    }
      Votos: 0 - Link respuesta
     
  • Fecha: 26-09-2017 04:57:28 Hola, yo encontré una solución que me alivió bastante el tema.

    Primero el HTML el llamado al PHP:

    <form class="form-horizontal" id='formulario' method='post' action='enviar.php' enctype="multipart/form-data">

    <label class="control-label col-sm-4" for="archivo1"></label>
    <div class="input-group input-group-md">
    <input type="file" name="archivo1" id="archivo1" class="form-control" aria-describedby="sizing-addon1" style="border: #ccc solid 1px; color:#000; width:370px; height:34px; font-family:'Arial'; font-weight:normal; font-size:12px;" required>
    </div>

    <label class="control-label col-sm-4" for="titulo"><h4>Título</h4></label>
    <div class="input-group input-group-md">
    <input type="text" name="titulo" class="form-control" size="100" placeholder="Ingrese un título" aria-describedby="sizing-addon1" style="border: #ccc solid 1px; color:#000; width:87%; height:34px; font-family:'Arial'; font-weight:normal; font-size:14px;">
    </div>


    <button type="submit" class="btn btn-default">Enviar</button>

    </form>

    (Le puedes agregar todo lo que quieras teniendo en cuenta el name para cada input y el for para label)

    y el PHP:

    <?php


    function form_mail($sPara, $sAsunto, $sTexto, $sDe)
    {

    $bHayFicheros = 0;
    $sCabeceraTexto = "";
    $sAdjuntos = "";
    $sCuerpo = $sTexto;
    $sSeparador = uniqid("_Separador-de-datos_");
    $sCabeceras = "MIME-version: 1.0\n";

    // Recogemos los campos del formulario
    foreach ($_POST as $sNombre => $sValor)
    $sCuerpo = $sCuerpo."\n".$sNombre." = ".$sValor;

    // Recorremos los Ficheros
    foreach ($_FILES as $vAdjunto)
    {

    if ($bHayFicheros == 0)
    {

    // Hay ficheros

    $bHayFicheros = 1;

    // Cabeceras generales del mail
    $sCabeceras .= "Content-type: multipart/mixed;";
    $sCabeceras .= "boundary=\"".$sSeparador."\"\n";

    // Cabeceras del texto
    $sCabeceraTexto = "--".$sSeparador."\n";
    $sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n";
    $sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n\n";

    $sCuerpo = $sCabeceraTexto.$sCuerpo;

    }

    // Se añade el fichero
    if ($vAdjunto["size"] > 0)
    {
    $sAdjuntos .= "\n\n--".$sSeparador."\n";
    $sAdjuntos .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";
    $sAdjuntos .= "Content-Transfer-Encoding: BASE64\n";
    $sAdjuntos .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n";

    $oFichero = fopen($vAdjunto["tmp_name"], 'rb');
    $sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"]));
    $sAdjuntos .= chunk_split(base64_encode($sContenido));
    fclose($oFichero);
    }

    }

    // Si hay ficheros se añaden al cuerpo
    if ($bHayFicheros)
    $sCuerpo .= $sAdjuntos."\n\n--".$sSeparador."--\n";

    // Se añade la cabecera de destinatario
    if ($sDe)$sCabeceras .= "From:".$sDe."\n";

    // Por último se envia el mail
    return(mail($sPara, $sAsunto, $sCuerpo, $sCabeceras));
    }

    //Ejemplo de como usar:
    if (form_mail("usuario_destino@dominio.com",
    "El nombre del remitente",
    "Los datos introducidos en el formulario son:\n",
    "usuario_destino@dominio.com"))
    ;

    // Ejemplo de como usar, poniendo como remitente el campo pasado de E-mail
    /*
    if (form_mail("usuario_destino@dominio.com",
    "Activación de formulario",
    "Los datos introducidos en el formulario son:\n",
    $_POST["E-mail"]))
    echo "Su formulario ha sido enviado con exito";
    */


    ?>

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 16-11-2017 03:25:49 Hola grupo, cordial saludo.
    Muy buen ejemplo, lo he probado y me ha funcionado de maravilla, pero para mi caso no he logrado hacer que envie archivos que ya se encuentran en el server.

    Tengo una carpeta temporal que almacena archivos pdf tipo notificacion para cada empleado (temp/cedulaEmpleado.pdf) y quiero automatizar el envio de estas notificaciones.

    ¿Cómo hago para cambiar el $_FILE['archivo'] por el archivo que ya esta en el servidor y no utilizar input type=file?

    Agradezco su colaboracion.
      Votos: 0 - Link respuesta
     
  • Fecha: 27-12-2017 05:10:14 Hola Fernando Mosquera to codigo me funciona muy bien peor tengo el inconveniente que cuando quiero usar el correo de la empresa este no me deja enviar correos a dominios externos para poder salir a correos externos solo lo puedo hacer usando la configuracion de gmail. me ayudarias guandome como puedo hacer para que la configuracion con el correo de la empresa funcione que libreria tengo poner o configurar. De antemanos mil gracias. Saludos   Votos: 0 - Link respuesta
     
  • Fecha: 10-02-2018 07:33:07 Hola. Tuve un inconveniente similar, pero gracias a la información encontrada acá se pudo superar. Gracias.   Votos: 0 - Link respuesta
     
  • Fecha: 22-02-2018 07:21:08 Hola, buenas tardes estoy utilizando el código compartido, pero al generarlo me sale un error de que el archivo no fue encontrado, alguien que me pueda ayudar?, por favor   Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com