Проблемы кодировки символов в 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.