Tecnología y Coaching para Emprendedores

Enviar Correo Vía PHP con Codificación UTF-8 de Acentos y Ñ’s

snippets

En este artículo vamos a ver cómo codificar correctamente los datos recogidos de un formulario web que se envían a un correo electrónico vía la función mail() de PHP. En una entrada anterior ya vimos cómo hacer para que los datos recogidos vía MySQL se mostraran correctamente en phpmyadmin, aquí integraremos lo entonces visto para que, tanto si miramos los datos vía email, como si los consultamos a través de phpmyadmin, podamos ver los acentos y las ñ‘s de manera correcta.

La función mail() de PHP

La función mail() de PHP está configurada para enviar por defecto los caracteres con codificación ASCII. Esto hace que se devuelvan caracteres extraños como +Â o cosas por el estilo. Existe un artículo muy bueno para corregir los errores con acentos y eñes, el problema es que parte de la solución requiere modificar el archivo httpd de Apache, lo cual no es posible si tenemos un servidor compartido, lo que es el caso de muchos usuarios.

Función para codificación UTF-8 de acentos y ñ’s

Con una simple función de PHP podremos ver correctamente los acentos y ñ’s de cualquier formulario web en nuestro email. La función está extraída de un foro y es esta:

<?php
 function mail_utf8($to, $subject = '(No subject)', $message = '', $header = '') {
  $header_ = 'MIME-Version: 1.0' . "rn" . 'Content-type: text/plain; charset=UTF-8' . "rn";
  mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);
}
 
?>

Para aquellos que justo os iniciáis en PHP y no sabéis como implementar esta función, os mostramos todo el código para que lo podáis copiar e implementar en vuestros formularios de contacto.

<?php
               
//cambia el nombre del correo por el tuyo
$para      = 'tucorreo@tudominio.com';
$titulo = 'Formulario de Contacto';
$mensaje = "Contacto:nn";
$mensaje .= "Nombre: " . $_POST["nombre"] . "n";
$mensaje .= "Email: " . $_POST["email"] . "n";
$mensaje .= "Tel.: " . $_POST["telefono"] . "n";
$mensaje .= "Mensaje: " .$_POST["mensaje"] . "n"; 
                                    
function mail_utf8($to, $subject = '(No subject)', $message = '', $header = '') {
   $header_ = 'MIME-Version: 1.0' . "rn" . 'Content-type: text/plain; charset=UTF-8' . "rn";
   mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);

// llamamos a la función creada y enviamos el correo con los datos del formulario                                    
mail_utf8($para, $titulo, $mensaje);

// Mensaje que le aparece en pantalla al que envía el formulario de contacto                                
echo("Gracias por contactar con nosotros. En breve nos pondremos en contacto contigo.");           
}                                   
?> 

<form class="formulario" id="form" method="post" action="">
     <h2>Mándanos un mensaje</h2>
     <ul>
     <li>
      <label  for="cname">Nombre</label><br/>
      <input id="cname" name="nombre" size="40" class="required"/>
   </li>
   <li>
      <label for="cemail"><Email</label><br/>
      <input id="cemail" name="email"  size="40" class="required email" />
   </li>
   <li>
      <label id="mensaje" for="ccomment"><?php _e("Mensaje");?><span class="asterix">*</span></label><br/>
      <textarea id="ccomment" name="mensaje"  class="required" rows="7" cols=""></textarea>
   </li>
   <li>
      <input class="submit" type="submit" id="enviar" value=""/>
   </li>
      </ul>
</form>

Espero que os haya ayudado, el ejemplo está sacado del código del formulario de contacto de este sitio web. Para cualquier duda, dejad un comentario y lo miramos.


Comentarios

  • Ionatan

    Hola, que tal. estoy teniendo un problema con mi pagina web, ahora tengo una consulta, he pegado en mi seccion de contacto en el html desde hasta tal como lo hicieron uds. y cree un archivo php llamado send.php y pegue lo que esta entre y en mi html en donde dice action le agregue un llamado a mi archivo send.php de la siguiente forma: action=”http://www.ha-makom.com/send.php”, cuando subo la web a internet me dirijo a la seccion de contactos relleno los campos, hago click en enviar y la pagina se redirecciona a mi archivo send.php pero no hace mas nada y no puedo recibir emails. Si uds podria ser tan amable y ayudarme, se lo agradeceria porque me estoy volviendo loco con este asunto Gracias

    • Sandra

      En action tienes que poner action=”send.php”. Espero que ahora te funcione

  • Juan Minero

    Agregale
    $cabecera = “MIME-Version: 1.0\r\n”;
    $cabecera .= “Content-type: text/html; charset=utf-8\r\n”;

    $asunto = ‘canción añeja’;
    $asunto = utf8_decode($asunto);

    Con eso tendrás.

    • Gema

      Muchas gracias por compartirlo.