2009-11-12 20 views
6

Estoy enviando un boletín por correo PHP() en español, tienen acentos y caracteres especiales (que voy a tratar de pegar aquí: á, í, é, ñ. ..).Enviar correos electrónicos con acento internacional y caracteres especiales

Para la versión HTML del correo electrónico, creo que he resuelto el problema mediante la impresión de á, é ...

Sin embargo, para la versión de texto sin formato, supongo que no puedo poner esos, ¿verdad?

¿Qué es lo mejor que se puede hacer, tanto para la versión HTML como para la versión de texto sin formato? Más tarde, podría tener que enviar correos electrónicos en idiomas más complejos, como hebreo o chino ...

¡Gracias!

Respuesta

23

Necesita usar MIME. Añadir cabeceras de correo:

MIME-Version: 1.0 
Content-Type: text/plain;charset=utf-8 

(Si ya está utilizando un MIME multipart/alternative para poner HTML y texto en el mismo correo, se pone el Content-Type: text/plain;charset=utf-8 en el sub-cabeceras de la parte de texto en su lugar.)

Esto supone que la codificación en la que enviarás tus caracteres "internacionales" es UTF-8. Si espera atender varios países, UTF-8 es la única opción razonable de codificación que se puede usar en su aplicación, pero si realmente no lo ha pensado, su sitio puede tener una codificación de Europa occidental. Verifique que cosas como los caracteres chinos funcionen correctamente en su sitio y base de datos antes de preocuparse por ellos en el correo.

Derail: hay lugares donde el envío de correo en UTF-8 no es lo más efectivo. No sé nada de China, pero en Japón todavía hay algunos sistemas de correo ridículos (especialmente webmail) que no pueden hacer frente a Unicode y que tienen que recibir una codificación específica del lugar, como Shift-JIS. Si se concentra en esos mercados, a menudo terminará teniendo que usar iconv para crear versiones del correo especialmente codificadas. Desagradable.

Ahora, debido a que muchos servidores de correo no pueden manejar los caracteres que no son ASCII en el cuerpo del correo, tendrá que codificarlos. Puede elegir entre comillas imprimibles o base64 para esto; QP es generalmente más pequeño y más fácil de leer para el contenido que tiene caracteres ASCII en ella también:

Content-Type: text/plain;charset=utf-8 
Content-Transfer-Encoding: quoted-printable 

Hello! An a-acute is =C3=A1 

La función de codificar en este formato es quoted_printable_encode. Sin embargo, necesita un PHP razonablemente actualizado para obtener esa función; si no lo tiene, puede configurar el Content-Transfer-Encoding en el base64 en su lugar y usar base64_encode.

Por último, si desea incluir caracteres no ASCII en los encabezados (por ejemplo, en From, To o Subject), hay una sintaxis completamente diferente:

Subject: =?utf-8?b?QW4gYS1hY3V0ZSBpcyDDoQ==?= 

Donde que QW...== desastre en el medio es el base64_encode de "An a-acute is á" en UTF-8.

+0

Esa 'sintaxis completamente diferente' es la codificación RFC2047 'B'. Por lo general, es mejor utilizar la codificación 'Q' del mismo RFC, ya que generalmente es más legible (al igual que la impresión entre comillas) y más corta. PHPMailer maneja ambas cosas, y en general es una forma mucho mejor de resolver la codificación que tratar de hacerlo desde cero: ¡para eso son las bibliotecas! – Synchro

1

Los caracteres acentuados como á, í, é, ñ funcionan en texto sin formato para la configuración de codificación del navegador predeterminada.

Los asiáticos como los caracteres chinos suelen ser basura.

Sí, texto plano + HTML es la forma recomendada.

1

Si su contenido de correo electrónico está codificado como UTF-8, y está enviando el correo electrónico como UTF-8, entonces no debería tener que usar ningún manejo especial de caracteres internacionales en su parte Html o Texto.

+3

¿Cómo me aseguro de que mi correo electrónico se envíe como UTF-8? –

Cuestiones relacionadas