Проблеми кодування символів 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.
Гогович

Відповіді:


476

Якщо ви на 100% впевнені, що $ message містить 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 - Поле заголовка контенту передачі вмісту .


35
Ну я не знаю, чи когось хвилює, як це божевільна стара, але мені довелося додати $ mail-> Encoding = "base64", щоб це працювало для мене
Андрій Ревак,

5
@AndrewRevak Ви врятували день! :)
carla

3
@AndrewRevak Чудові речі! Це те, що її вирішило.
BernardA

Використання mb_detect_encoding та mb_convert_encoding було б добре.
BluE

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

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

спробуйте це

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

5
Я оновив цю публікацію для кращого читання, але на запитання ОП вже відповіли 2 роки тому! І той прийнятий відповідь вже включав цей.
Dwza

5

Вибачте, що запізнилися на вечірку. Залежно від конфігурації вашого сервера, вам може знадобитися вказувати символи строго з малої літери utf-8, інакше він буде ігнорований. Спробуйте це, якщо ви знайдете рішення та жоден з вищезазначених відповідей не допомагає:

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

слід замінити на:

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

5

Я працюю таким чином

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

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


У мене нічого немає POST, просто звичайна французька рядок, записана у закодованому файлом utf-8, і це спрацювало як шарм, дякую!
toni07


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.

pff ..


Так, це правильно. Ви повинні розмістити його після встановлення об'єкта.


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
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 (); рядок.

pff ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.