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

AlexV
источник
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";
user2354947
источник
5
Я обновил этот пост для лучшего чтения, но на вопрос оп уже отвечали 2 года назад! И этот принятый ответ уже включил этот.
Двза
5

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

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

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

$mail->CharSet = "utf-8";
vzr
источник
5

Я сам так работаю

  $mail->FromName = utf8_decode($_POST['name']);

http://php.net/manual/en/function.utf8-decode.php

yorkfx
источник
У меня нет ничего POST, просто обычная французская строка, написанная в кодированном файле utf-8, и это сработало как шарм, спасибо!
toni07
3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
Али Эбрахими
источник
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);

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

biojazzard
источник
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 (); линия.

пфф ..


источник