I think im doing things correct:
Im specifying charset of PHPMailer object: $mail->CharSet = "UTF-8";
Charsets of mail body and php script are UTF-8 too
But email arrives with this kind of errors (words are broken by black quarter with "?" symbol:
опреÐ �елени
оÑ �ибка определения
click to see the screenshot of example email
Update 1
Found something kinda chinese glyphs (but not cyrillyc symbols) in the email's source
Try:
$mail = new PHPMailer();
$mail->CharSet = 'UTF-8';
as staded by user2354947 in PHPMailer character encoding issues
the CharSet definition must be entered after the PHPMailer()
similar to my problem PHP ASCII to UTF-8 does not work
i found out that when you pull your data from sql, you need to transform it to UTF-8
Related
I have a problem that the subject is printed for Persian letters like this:
تست
I changed Cherst to utf-8 but the problem was not resolved
body has no problem with Persian letters, the only problem is the subject
$phpmailer->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
Don't encode your subject yourself; it will interfere with PHPMailer's processing. To get PHPMailer to handle it for you, just do this:
$mail->CharSet = 'UTF-8';
After that make sure that all your other text processing is in UTF-8 (e.g. your database), and it will all work.
I have been trying to send an HTML email with PHPMailer containing emojis:
$mail = new PHPMailer();
$mail->isHTML(true);
$mail->CharSet = "UTF-8";
$mail->Subject = "😀 😃 😄 😁 😆 😅 😂 🤣 😊 😇 🙂 🙃 😉 😌";
$mail->Body = "😀 😃 😄 😁 😆 😅 😂 🤣 😊 😇 🙂 🙃 😉 😌";
However, the emojis are only displayed correctly in the subject; in the body, they are replaced by question marks (in Thunderbird and Outlook). The email does contain HTML, so just setting isHTML to false will not suffice. I have looked at Send unicode emoji with PHPMailer , but it does not seem to work for me, as the character set is already set to UTF-8. The content is user-generated (the user uses their own mobile keyboard to insert the emoji), so manually replacing every emoji with, for example, an image is not an option. Preferably the solution would be dynamic, so that new emojis also work whenever they come out.
you need to specify emoji's unicode value and try below method.
echo json_decode('"\uD83D\uDE00"');
Also you can use UTF-8 notation from this this table:
example:
😁 \xF0\x9F\x98\x81 GRINNING FACE WITH SMILING EYES
I use the PHPMailer as my mail tool for a project. I should send to a user a letter which contains Romanian alphabet (the main difference from English letters is the fact of issue such letters as â, ă, î, ș, ț).
I set charset UTF-8 for my letter:
$mail->CharSet = 'UTF-8';
but it didn't help me. I see in Google mail signs ? instead â, ă, î, ș or ț.
How can I fix it?
I use phpMailer (as of today version in GitHub) to send automatic smtp activation mails from my noreply#host.com.
I tried it in gmail and yahoo. Both interpreted the characters as shown below.
nice unwanted (realized)
Ç -> Ç
ı -> Ä
ş -> Åž
mailing process order is:
"sign page" (has the form, utf-8 encoded), then
"assess_from_sign.php" (pure php without any encoding command. actual
sending or failure process is here),then
"inform page" (informs user for result)
my message in mail body starts with Dear $_POST['username']
What can I apply to $_POST['username'] variable in assess_from_sign.php page so even non-English characters seems exactly like in their own language.
note: all requests are redirecting to index.php page in my site and it has mb_internal_encoding("UTF-8"); command which applies to all pages.
thanks, regards
It's important that all aspects of the code is set to the same, specific charset. I recommend UTF-8 as you already started using, which covers most characters you'll ever need.
Below you'll find a "checklist" of what should be set to UTF-8.
PHP header - this has to be put prior to any output to the browser, and should be put on the top of all your .php pages: header('Content-Type: text/html; charset=utf-8');
HTML header - this should also be in all your pages containing HTML, and it to be put inside the <head> tags: <meta charset=utf-8" />
PHPMailer Object - specify the charset of your PHPMailer object by adding
$mail->CharSet = 'UTF-8';, where $mail is the object itself.
File-encoding: The file itself should be converted to a UTF8 charset (specifically UTF8 w/o BOM). This varies a bit on what kind of texteditor your are using, but in Notepad++ it's Format -> Convert to UTF8 (w/o Byte Order Mark).
There might be other aspects of your code that need to be set to an UTF8 charset (databases and such), but this should cover the mail-properties.
You can also reference UTF-8 all the way through.
When I send an email containing £ using PHP mail it appears in outlook/hotmail as £. In Gmail/thunderbird it's fine.
Any idea how I can fix this?
The problem is, the client doesn't know what encoding is used to encode the subject. Whatever your application sets in Content-Type header only applies to the body of the email, not the headers.
Usually this affects the following headers:
Subject
From
To
In order to use different encodings your internationalized header lines should be MIME-encoded (as of RFC 2047), using one of the two methods: base64 (B) or modified quoted-printable (Q). The encoded subject usually looks like this:
Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
This may look difficult, but there is one very handy helper function in PHP which does all the magic:
iconv_mime_encode() - Composes a MIME header field
Alternatively you may look into discussion under:
quoted_printable_encode() - Convert a 8 bit string to a quoted-printable string
Before using quoted_printable_encode() directly you neet to take into account that long lines need to be split at certain length and spaces need to be replaced with underscore "_".
Just today I fixed a similar subject encoding issue by using phpmailer instead of php's builtin mail:
$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->CharSet = "utf8";
$mail->Subject = $mail->EncodeHeader("You won £10000000!");
....
$retval = $mail->Send();
Usually I use the mb_convert_encoding() function
mb_convert_encoding($string, "UTF-8"); //AUTO DETECT AND CONVERT
mb_convert_encoding($string, "UTF-8", "latin1"); //MANUAL SET - CHANGE latin1 TO CURRENT ENCODING
Try to use UTF-8 encoding in your email.
this had results for my
<?php $subject = "=?UTF-8?B?" . base64_encode($subject) . "?="; ?>