Envío de email con adjunto (PHP)

De wikipedia_IndianWebs
Saltar a: navegación, buscar


Con el siguiente código puede realizarse el envío de un email con un único archivo adjunto, pasando los valores necesarios por parámetro.

<?php

/*
    Envía con formato HTML un email con un archivo adjunto
    
    
    Parámetros:
    $n_campo_fichero = name del input file en el formulario
    $e_receptor = email receptor
    $e_emisor = email emisor
    $n_emisor = nombre emisor
    $asunto = asunto
    $mensaje = mensaje
    $max_file_size = tamaño max de fichero
    $allowed_extensions = array con el nombre de las extensiones permitidas. Si se permiten todas, poner var normal con "all"
*/

function envia_email_con_adjunto($n_campo_fichero,$e_receptor, $e_emisor, $n_emisor, $asunto, $mensaje, $max_file_size=300000, $allowed_extensions){
    $errors ='';
	//Get the uploaded file information
	$name_of_uploaded_file =  basename($_FILES[$n_campo_fichero]['name']);//obtenemos el nombre del fichero (con su extension)
	
	//get the file extension of the file
	$type_of_uploaded_file = substr($name_of_uploaded_file, 
							strrpos($name_of_uploaded_file, '.') + 1);//guardamos en otra variable la extension
	
	$size_of_uploaded_file = $_FILES[$n_campo_fichero]["size"]/1024;
	
	///comprobamos si hay inyección de código en email emisor
	if(IsInjected($e_emisor))
	{
		$errors .= "\n Email incorrecto.";
	}
	
	if($size_of_uploaded_file > $max_file_size ) //controlamos el tamaño del fichero
	{
		$errors .= "\n El tamaño no puede ser mayor a $max_file_size";
	}
	
	//------ Validate the file extension -----
    
    if($allowed_extensions!="all"){//solo comprobaremos si hemos pasado un array con extensiones
    	$allowed_ext = false;
    	for($i=0; $i<sizeof($allowed_extensions); $i++) 
    	{ 
    		if(strcasecmp($allowed_extensions[$i],$type_of_uploaded_file) == 0)
    		{
    			$allowed_ext = true;		
    		}
    	}
    	
    	if(!$allowed_ext)
    	{
    		$errors .= "\n Formato de fichero no permitido. ".
    		" Sólo se permiten los siguientes formatos: ".implode(',',$allowed_extensions);
    	}
	}
	//send the email 
	if(empty($errors))
	{
        $file = $_FILES[$n_campo_fichero]["tmp_name"];
        if(!mail_attachment($name_of_uploaded_file,$file, $e_receptor, $e_emisor,$n_emisor, $e_emisor, $asunto, $mensaje)){
            $errors.="Envío fallido";
        }
		
	}else{
	   
	}
    return $errors;
 
}
///////////////////////////Functions/////////////////
// Function to validate against any email injection attempts
function IsInjected($str)
{
  $injections = array('(\n+)',
              '(\r+)',
              '(\t+)',
              '(%0A+)',
              '(%0D+)',
              '(%08+)',
              '(%09+)'
              );
  $inject = join('|', $injections);
  $inject = "/$inject/i";
  if(preg_match($inject,$str))
    {
    return true;
  }
  else
    {
    return false;
  }
}

/*
    Parámetros:
    $filename = nombre del fichero que se mostrará en el adjunto al correo
    $mailto = email destino
    $from_mail = email origen
    $from_name = nombre del enviador
    $replyto = mail donde contestar al enviador
    $subject = asunto
    $message = mensaje
*/

function mail_attachment($filename, $file,$mailto, $from_mail, $from_name, $replyto, $subject, $message) {    
    
    $file_size = filesize($file);
    $handle = fopen($file, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $name = basename($file);
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-type: text/html; charset=UTF-8\r\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $header .= $message."\r\n\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $header .= $content."\r\n\r\n";
    $header .= "--".$uid."--";
    return(mail($mailto, $subject, "", $header));
}


?>

--David (discusión) 18:09 26 jun 2012 (CEST)

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas
Compartir
Categorías
Apps
[×] CSS
[×] Diseño
Google
[×] Joomla
[×] Magento
[×] Mobile
[×] RRHH
[×] YouTube