Проблемы кодировки символов в PHPMailer


190

Я пытаюсь использовать PHPMailer для отправки регистрации, активации. и т.д. почта для пользователей:

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

$messageСодержит латинские символы. К сожалению, вся веб-почта (gmail, webmail.mydomain.org, emailaddress.domain.xx) использует другую кодировку.

Как я могу заставить использовать кодировку UTF-8, чтобы моя почта отображалась одинаково на всех почтовых ящиках?

Я пытался конвертировать ширину заголовка письма mb_convert_encoding(), но без удачи.


Капитализация CharSet выше была изменена bovender.
Gogowitsch

Ответы:


476

Если вы на 100% уверены, что сообщение $ содержит ISO-8859-1, вы можете использовать utf8_encode, как говорит Дэвид. В противном случае используйте mb_detect_encoding и mb_convert_encoding для $ message.

Также обратите внимание, что

$mail -> charSet = "UTF-8"; 

Должен быть заменен на:

$mail->CharSet = 'UTF-8';

И помещается после создания экземпляра класса (после new). Свойства чувствительны к регистру! Смотрите документ PHPMailer для списка и точное написание.

Также по умолчанию используется кодировка PHPMailer, 8bitкоторая может быть проблематичной с данными UTF-8. Чтобы это исправить, вы можете сделать:

$mail->Encoding = 'base64';

Обратите внимание, 'quoted-printable'что в этих случаях это может сработать (и может быть даже 'binary'). Для более подробной информации вы можете прочитать RFC1341 - Поле заголовка Content-Transfer-Encoding .


35
Ну, я не знаю, волнует ли это кого-то, потому что это безумно старый, но мне пришлось добавить $ mail-> Encoding = "base64", чтобы заставить это работать на меня
Эндрю Ревак,

5
@AndrewRevak Вы спасли день! :)
Карла

3
@AndrewRevak Отличная вещь! Это то, что решило это.
Бернарда

Использование mb_detect_encoding и mb_convert_encoding было бы неплохо.
Блю

26
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

строка $mail -> CharSet = "UTF-8";должна быть после $mail = new PHPMailer();и без пробелов!

попробуй это

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

5
Я обновил этот пост для лучшего чтения, но на вопрос оп уже отвечали 2 года назад! И этот принятый ответ уже включил этот.
Двза

5

Извините за опоздание на вечеринку. В зависимости от конфигурации вашего сервера, вам может потребоваться указывать символ строго строчными буквами utf-8, иначе он будет проигнорирован. Попробуйте это, если вы в конечном итоге ищете решения, и ни один из приведенных выше ответов не поможет:

$mail->CharSet = "UTF-8";

следует заменить на:

$mail->CharSet = "utf-8";



3

Я получал & oacute; в $ mail-> Subject / w PHPMailer.

Так что для меня полное решение:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

Надеюсь, поможет.


1

Когда ничего из вышеперечисленного не работает, а почта выглядит так ª הודפסה ×•× ×©×œ:

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

0

@ $mail -> charSet = "UTF-8";

--- эта строка должна быть под

$mail = new PHPMailer(); line.

пфф ..


Да, это правильно. Вы должны разместить его после создания объекта.


Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любой пост .
piet.t

Это не критика или разъяснение по этому вопросу. Правильный ответ: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Никос Капетанакос

Знаете, это похоже на комментарий к ответу Холиана, поскольку он ничего не добавляет к нему.
piet.t

если вы используете свойство charSet не будет работать. Правильным является CharSet. Дело делает другое.
Никос Капетанакос

Хорошо, тогда почему вы цитируете неправильный ответ вместо того, чтобы дать правильный? Но этот уже есть, так что вы должны добавить?
piet.t

0

Самый простой способ, который поможет вам - это установить CharSet в UTF-8.

$mail->CharSet = "UTF-8"

@NickZuber Точная строка там из-за правок. Это было не совсем точно в первоначальном вопросе ...
Мистер Цйолдер,

0

Чтобы избежать проблем с кодировкой символов при отправке электронных писем с использованием класса PHPMailer, мы можем настроить его так, чтобы отправлять его с кодировкой символов UTF-8 с использованием параметра «CharSet», как мы видим из следующего кода Php:

$mail = new PHPMailer();
$mail->From = 'midireccion@email.com';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('emaildestino@email.com');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


// Active condition utf-8
$mail->CharSet = 'UTF-8';


// Send mail
$mail->Send();

-5

$ mail -> charSet = "UTF-8"; --- эта строка должна быть в $ mail = new PHPMailer (); линия.

пфф ..

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.