Pregunta:
Fecha: 18-09-2016 19:57:21
(En Español)
Votos: 2 - Respuestas: 8 - Vistas: 16 Compartir en: Google Facebook Twitter LinkedIn Link
Enviar email desde PHP con archivo adjunto al mirar en el correo no sale el archivo sino unas letras [Resuelta]
El correo me envia normal pero al ingresar a revisarlo me salen un poco de letras extrañas y no llega el archivo que subí
<?php
//si recibe un formulario
if(isset($_POST['submitted'])) {
if(trim($_POST['checking']) !== '') {
$captchaError = true;
} else {
//revisa el nombre
if(trim($_POST['contactName']) === '') {
$nameError = 'Olvidaste ingresar tu nombre.';
$hasError = true;
} else {
$name = trim($_POST['contactName']);
}
//revisa el email
if(trim($_POST['email']) === '') {
$emailError = 'Olvidaste ingresar tu email.';
$hasError = true;
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+.[A-Z]{2,4}$", trim($_POST['email']))) {
$emailError = 'Ingresa un email real.';
$hasError = true;
} else {
$email = trim($_POST['email']);
}
$tiempoEspera = 3;
if (!isset($_FILES['file']) || !isset($_FILES['file']['tmp_name']) || strlen($_FILES['file']['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();
}
//$archivoNombre = $_FILES['file']['name']; //nombre del archivo a ser enviado (sin la ruta, solo el nombre con la extensión, por ejemplo: imagen.jpg)
$archivo = $_FILES['file']['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
//revisa el mensaje
if(trim($_POST['textoMensaje']) === '') {
$commentError = 'No ingresaste ningun mensaje.';
$hasError = true;
} else {
if(function_exists('stripslashes')) {
$comments = stripslashes(trim($_POST['textoMensaje']));
} else {
$comments = trim($_POST['textoMensaje']);
}
}
}
//si no hay errores envia el email
if(!isset($hasError)) {
$emailTo = 'antauri285@gmail.com';
$subject = 'Mensaje de '.$name;
$body = "Nombre: $name \n\nEmail: $email \n\nComentario:\n\n $comments \n\n Archivo: $archivo";
$headers = 'From: Mi blog ' . "\r\n" . 'Reply-To: ' . $email;
mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}
}
get_header(); ?>
</header>
<!-- Row for main content area -->
<div id="content" class="site-content">
<?php
//Si el email es enviado muestra un mensaje
//Sino muestra el formulario
if(isset($emailSent) && $emailSent == true) { ?>
<h3>Gracias por comunicarte, <?php echo $name;?></h3>
Te email sera atendido y respondido a la brevedad.
<?php } else { ?>
<?php if(isset($hasError) || isset($captchaError)) { ?>
<script type="text/javascript">
alert("Hubo un error enviando el formulario.");
</script>
<?php } ?>
<section class="contact" id="contact">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Contáctanos <i class="fa fa-paper-plane-o"></i></h1>
<p>Su opinión es muy inportante para nosotros. Déjenos sus comentarios, quejas y reclamos.</p>
</div>
</div>
<div class="row">
<form method="post" action="<?php the_permalink(); ?>" name="contactform" id="contactform" enctype="multipart/form-data">
<div class="col-md-6">
<fieldset>
<input type="text" name="contactName" value="<?php if(isset($_POST['contactName'])) echo $_POST['contactName'];?>"
placeholder="Nombre"/>
<?php if($nameError != '') { ?>
<span class="error"><?=$nameError;?></span>
<?php } ?>
<br>
<input type="text" name="email" value="<?php if(isset($_POST['email'])) echo $_POST['email'];?>" placeholder="Email" />
<?php if($emailError != '') { ?>
<span class="error"><?=$emailError;?></span>
<?php } ?>
<br>
<input type="file" name="file" id="file" size="40" class="input-file">
<label for="file" class="btn btn-tertiary js-labelFile">
<i class="icon fa fa-check"></i>
<span class="js-fileName"> Sube un archivo</span>
</label>
</fieldset>
</div>
<div class="col-md-6">
<fieldset>
<textarea name="textoMensaje" rows="15" cols="40" placeholder="Mensaje" ><?php if(isset($_POST['textoMensaje'])) { if(function_exists('stripslashes')) { echo trim(stripslashes($_POST['textoMensaje']));
} else { echo trim($_POST['textoMensaje']); } } ?></textarea>
<?php if($commentError != '') { ?>
<span class="error"><?=$commentError;?></span>
<?php } ?>
</fieldset>
</div>
<div class="col-md-12">
<fieldset>
<input id="submitted" type="hidden" name="submitted" value="true" />
<input type="submit" class="enviabnt" value="Enviar" />
<br>
<label class="screenReader" for="checking" style="visibility:hidden">Deja este campo vacio para demostrar que eres humano</label>
<input id="checking" class="screenReader" style="visibility:hidden" type="text" name="checking" value="<?php if(isset($_POST['checking'])) echo $_POST['checking'];?>" />
</fieldset>
</div>
</form>
</div>
<?php } ?>
</div>
</section>
</div>
<!-- End content row -->
<?php get_footer(); ?>
Votos: 2 - Respuestas: 8 - Vistas: 16 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 19-09-2016 03:16:44 Hola Jhonny, ante todo bienvenido a la comunidad.
Casualmente hace un par de meses di un ejemplo de como envíar archivos adjuntos desde PHP, aquí lo puedes ver "Enviar email desde PHP con archivo adjunto"
No he analizado tu código, pero por tus comentarios estimo tienes alguna diferencia en el encabezado del email. Compara tu código con el de mi ejemplo, seguramente daras con la solución.
Espero que mi respuesta te sea de ayuda, luego nos cuentas como te fue.
Saludos y buen código! Votos: 1 - Link respuesta -
Fecha: 19-09-2016 06:17:19 Yo revise tu código y me base en el pero cuando ajunto el archivo me llega al corro varios caracteres menos el archivo
Si me puedes colaborar seria de mucha ayuda, gracias Votos: 1 - Link respuesta -
Fecha: 19-09-2016 07:05:28 Hola Jhonny, veo que en tu código "obviaste" casi toda la cabecera, si yo la estoy poniendo en el ejemplo es porque es necesaria, no podes dejar afuera ni una línea:
$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 . "--";
Observa la "cabecera del email" y "armado del mensaje y attachment", ahí esta la clave, tomalo con calma, analiza línea a línea y verás que lo puedes resolver. Sería un error de mi parte darte la solución, porque aquí tienes todas las herramientas y el soporte para que tu lo resuelvas (el soporte de la comunidad y particularmente el mío).
Espero que comentes tus avances.
Saludos y buen código! Votos: 1 - Link respuesta -
Fecha: 24-09-2016 06:59:12 Buenos días, fijate, como bien dice Fernando en estas líneas
$header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
el secreto está en los (el) MIME
Saludos
DIEGO Votos: 1 - Link respuesta -
Fecha: 24-09-2016 11:48:40 Jhonny, buscá en internet "Escritura de Mensajes en PHP. Protocolo MIME" y te vas a ir sacando las dudas o ir entendiendo como funciona
Saludos
DIEGO Votos: 0 - Link respuesta -
Fecha: 25-09-2016 05:16:28 Es muy viejo mi código pero funciona (funcionaba):
<section class="texto"> <header class="titulo"> <h3>Envío de email</h3> </header> <?php function form_mail($destino, $asunto, $texto, $origen){ $ficheroAdj = 0; $textoCab = ""; $adjunto = ""; if ($origen)$cabeceras = "From:".$origen."\n"; else $cabeceras = ""; $cabeceras .= "MIME-version: 1.0\n"; foreach ($_POST as $nombre => $sValor) $texto = $texto."\n".$nombre." = ".$sValor; foreach ($_FILES as $vAdjunto){ if ($ficheroAdj == 0){ $ficheroAdj = 1; $cabeceras .= "Content-type: multipart/mixed;"; $cabeceras .= "boundary=\"--_Separador-de-mensajes_--\"\n"; $textoCab = "----_Separador-de-mensajes_--\n"; $textoCab .= "Content-type: text/plain;charset=iso-8859-1\n"; $textoCab .= "Content-transfer-encoding: 7BIT\n"; $texto = $textoCab.$texto; } if ($vAdjunto["size"] > 0){ $adjunto .= "\n\n----_Separador-de-mensajes_--\n"; $adjunto .= "Content-type: ".$vAdjunto["type"].";name=\"".$vAdjunto["name"]."\"\n";; $adjunto .= "Content-Transfer-Encoding: BASE64\n"; $adjunto .= "Content-disposition: attachment;filename=\"".$vAdjunto["name"]."\"\n\n"; $fichero = fopen($vAdjunto["tmp_name"], 'r'); $sContenido = fread($fichero, filesize($vAdjunto["tmp_name"])); $adjunto .= chunk_split(base64_encode($sContenido)); fclose($fichero); } } if ($ficheroAdj) $texto .= $adjunto."\n\n----_Separador-de-mensajes_----\n"; return(mail($destino, $asunto, $texto, $cabeceras)); } //cambiar aqui el email if (isset($_POST['asunto']) && isset($_POST['email'])) { if (form_mail("xxxxx@gmail.com", $_POST['asunto'], "Los datos introducidos en el formulario son:\n\n", $_POST['email'])) echo "Su formulario ha sido enviado con exito"; } ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" id="formenviar" enctype="multipart/form-data"> <fieldset class="opinion"> <legend>Mensaje</legend> <input type="hidden" name="destino" value="jmrarbulo@gmail.com"> <ul> <li> <label for="nombre">Nombre</label> <input type="text" id="nombre" name="nombre" placeholder="Nombre" required maxlength="50"> </li> <li> <li> <label for="email">Email</label> <input type="email" name="email" id="email" placeholder="nombre@ejemplo.com" required autofocus maxlength="50" /> </li> <li> <label for="asunto">Asunto</label> <input type="text" id="asunto" name="asunto" placeholder="Consulta" required maxlength="50"> </li> <li> <label for="mensaje">Texto</label> <textarea name="mensaje" id="mensaje" placeholder="Tiene hasta un máximo de 1000 caracteres para desarrollar su mensaje" required maxlength="1000"></textarea> </li> <li> <label for="archivo1">Adjuntar archivo</label> <input type='file' name='archivo1' id='archivo1'> </li> </ul> </fieldset> <input type="submit" name="enviar" value="Enviar"> </form>
Si algo falla me lo comentas y lo intataré de solucionar
P,D,: Camnbia xxxxx@gmail.com por el emaIn correspondiente.
Saludos Votos: 1 - Link respuesta -
Fecha: 26-09-2016 14:55:50 Estimado, le recomiendo utilizar la libreria phpmailer, la cual he probado y utilizado sin ningun inconveniente....
https://github.com/PHPMailer/PHPMailer Votos: 1 - Link respuesta -
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
