2

Creé un formulario de contacto para mi página web. En los documentos html el charset utf-8 funciona sin problemas, sin embargo, al enviar el formulario con php al servido de correo, el mail llega con fallas en los caracteres en español (acentos, ñ, ...).

Pensé que podía ser que en el archivo enviar.php (el que realiza la acción de enviar el formulario) no había una declaración de charset, pero no se cómo ponerla, he estado buscando en internet y lo que he encontrado no me ha funcionado.

Probé insertar el código php entre html para declarar meta charset, no funcionó ni con utf-8 ni ISO.

Probé con header ("Content-type: text/html; charset=utf8") y tampoco funciona.

¿Cuál es la forma correcta de declarar codificación e idioma en php?

Adjunto código de enviar.php:

<?php

  //nombrando campos
  $nombre = $_POST['nombre'];
  $apellido = $_POST['apellido'];
  $email = $_POST['email'];
  $telefono = $_POST['telefono'];
  $mensaje = $_POST['mensaje'];

  //datos para el correo
  $destinatario = "contacto@xxxxx.xx";
  $asunto = "Contacto Web: Tienes un mensaje de $nombre";
  $contenido = "De: $nombre $apellido \n";
  $contenido .= "Correo: $email \n";
  $contenido .= "Telefono: $telefono \n";
  $contenido .= "Mensaje: $mensaje \n";
  $contenido .= "¡RECUERDA CONTACTAR AL REMITENTE!";

  //enviar Correo
  mail($destinatario, $asunto, $contenido);
  header('Location:gracias.php');

 ?>
OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
Dosiscode
  • 55
  • 1
  • 6
  • [Revisa esta respuesta](https://es.stackoverflow.com/a/59510/29967), sobre todo en el *nivel 2*, donde habla de PHP. Creo que eso ocurre porque no tienes bien configurado el charset a nivel de servidor. – A. Cedano Jan 22 '19 at 13:21

3 Answers3

2

Cuando haces uso de header("Content-type: text/html; charset=utf8") en una página PHP estás enviando unas cabeceras HTTP al navegador para indicarle qué juego de caracteres usa la página web, pero cuando envías un correo electrónico esa cabecera no surte efecto porque no tiene ninguna relación lo que ve el cliente con lo que envías a un servidor SMTP para enviar un correo electrónico.

Lo que te falta es configurar unas cabeceras SMTP en el cuarto parámetro opcional de mail() similares a las que has usado para la página web para habilitar tanto transferencias de 8 bits como para indicar al cliente de correo que el contenido del mensaje está en UTF-8 (ver MIME).

$cabeceras = "MIME-Version: 1.0\r\n";
$cabeceras .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n";
$cabeceras .= "Content-Transfer-Encoding: 8bit\r\n";
//enviar Correo
mail($destinatario, mb_encode_mimeheader($asunto), $contenido, $cabeceras);
header('Location: gracias.php');

Es importante que uses Content-Transfer-Encoding: 8bit para evitar que el cliente SMTP te impida usar caracteres mayores al 127 (que son usados para caracteres especiales tanto en ISO como en UTF-8).

Edición: He incluido el uso de mb_encode_mimeheader() para que el asunto también pueda contener caracteres UTF-8 (o los que tengas configurados en mb_internal_encoding()).

Aún así te recomiendo usar PHPMailer para enviar correos electrónicos ya que te permite mayor flexibilidad tanto en el envío, adjuntar archivos, componer en HTML, etc.

OscarGarcia
  • 26,999
  • 3
  • 26
  • 61
1

Agrega esta cabecera.

$contenido = "Content-Type: text/html; charset=UTF-8";

Se que ya lo intentaste, pero ahora estamos separando el UTF-8.

Armando Mariscal
  • 910
  • 6
  • 15
1

la cabecera de @OscarGarcia debería ir así:

$cabeceras .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
Rodrigo Ramírez
  • 5,822
  • 4
  • 11
  • 32
user212032
  • 11
  • 1