Send emails with international accent and special characters

I am sending a newsletter via PHP mail() in Spanish, they have accents and special characters (which I'm going to try to paste here: á, í, é, ñ ...).

For the HTML version of the email, I think I solved the issue by printing á, é ...

However for the plain text version, I assume I can't put those, right?

What is the best thing to do, both for the HTML and plain text version? Later, I might have to send emails in more complex languages such as hebrew or chinese ...

Thanks!


Solution 1:

You need to use MIME. Add mail headers:

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

(If you are already using a MIME multipart/alternative to put HTML and text in the same mail, you put the Content-Type: text/plain;charset=utf-8 on the sub-headers of the text part instead.)

This is assuming that the encoding you'll be sending your “international” characters in is UTF-8. If you are expecting to cater for multiple countries UTF-8 is the only reasonable choice of encoding to use throughout your application, but if you haven't really thought about that yet your site may be defaulting to a Western European encoding. Check that things like Chinese characters work correctly in your site and database before worrying about them in mail.

Derail: there are locales where sending mail in UTF-8 isn't the most effective thing. I don't know about China, but in Japan there are still some backwards and ridiculous mail systems (especially webmail) that can't cope with Unicode and have to be given a locale-specific encoding such as Shift-JIS instead. If you are concentrating on those markets you'll often end up having to use iconv to create specially-encoded versions of the mail. Unpleasant.

Now, because many mail servers can't cope with non-ASCII characters in the mail body, you'll have to encode them. You can choose quoted-printable or base64 for this; quoted-printable is generally smaller and more readable for content that has ASCII characters in it too:

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

Hello! An a-acute is =C3=A1

The function to encode in this format is quoted_printable_encode. However you do need a reasonably up-to-date PHP to get that function; if you don't have it you could set the Content-Transfer-Encoding to base64 instead and use base64_encode.

Finally, if you want to include non-ASCII characters in the headers (for example in From, To or Subject), there is a completely different syntax:

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

Where that QW...== mess in the middle is the base64_encode of “An a-acute is á” in UTF-8.

Solution 2:

Accented characters like á, í, é, ñ works on plain-text for most default browser encoing setting.

Asian ones like chinese characters will be usually turn out to be garbage.

Yes, plain-text + HTML is the recommended way.