Задать вопрос

php, опять про кодировки

Hotmail отправляет письма в нежелательные из-за несоответствия кодировки самого письма (KOI8-R) и его тела. Заголовки to, subject, from отображаются нормально. Страница с формой в UTF-8.
	$data_charset = 'UTF-8'; // кодировка переданных данных
	$send_charset = 'KOI8-R'; // кодировка письма
	$to = mime_header_encode($name_to, $data_charset, $send_charset). ' <' . $email_to . '>';
	$subject = mime_header_encode($subject, $data_charset, $send_charset);
	$from = mime_header_encode($name_from, $data_charset, $send_charset).' <' . $email_from . '>';
	if($data_charset != $send_charset) {
		$body = iconv($data_charset, $send_charset, $body);
	}

В исходном коде письма отображаются крякозябры "ëÏÎÔÁËÔÙ". Декодер Лебедева говорит: CP1252 → KOI8-R.
Ок. Делаю замену как предлагает Ogra:
-	$body = iconv($data_charset, $send_charset, $body);
+	$body = iconv('utf-8', 'cp1252', $body);
+	$body = iconv('cp1251', 'KOI8-R', $body);

Теперь тело сообщения вообще пустое.
Причем $body теряется при utf-8=>cp1252.

Заголовки письма:
	$headers = "From: $from\r\n";
	$headers .= "Reply-To: support@example.com\r\n";
	$headers .= "Return-Path: support@example.com\r\n";
	$headers .= "X-Mailer: Drupal\n";
	$headers .= 'MIME-Version: 1.0' . "\n";
	$headers .= "Content-type: text/plain; charset=$send_charset; format=flowed\r\n";
	$headers .= "Content-Transfer-Encoding: 8bit\r\n";
  • Вопрос задан
  • 11037 просмотров
Подписаться 4 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 10
@m-haritonov
Ок. Делаю замену как предлагает Ogra:
— $body = iconv($data_charset, $send_charset, $body);
+ $body = iconv('utf-8', 'cp1252', $body);
+ $body = iconv('cp1251', 'KOI8-R', $body);
Теперь тело сообщения вообще пустое.
Причем $body теряется при utf-8=>cp1252.

Не удивительно. Вы, во-первых переводите строку из кодировки с более обширным набором символов (utf-8) в кодировку с менее обширным (cp1252). Во-вторых, переводите строку в кодировку cp1252, которая не содержит русских символов. В-третьих, сначала перекодируете строку в кодировку cp1252, а далее почему-то считаете, что у Вас строка теперь не в кодировке cp1252, а в кодирокве cp1251 и перекодируете уже из неё обратно в utf-8.

Если вкратце, то эта манипуляция с перекодированием не нужна, а декодеру доверять не стоит, т.к. он может иметь большую погрешность.
Ответ написан
NeX
@NeX
dkim, spf? заголовки письма на хотмаиле покажите. В Гмаил, Яндекс в спам не попадает?
Ответ написан
@dsd_corp
Не факт, что прям поможет, но…
На всякий случай попробуйте в хидерах нормализовать переводы строк.
У вас перед заголовком «Content-type» предыдущие две строчки оканчиваются на одинарный "\n".
Из-за этого парсер письма может вообще не видеть заголовок «Content-type», т.к. будет его считать продолжением предыдущего заголовка, в данном случае продолжением аж «X-Mailer».
Ответ написан
@Murloc
Бывает не работает «utf-8» c черточкой, попробуйте без просто «utf8». И ещё у вас разные там кодировки, utf-8=>cp1251 cp1252=>koi8-R
Ответ написан
@m-haritonov
У функции mime_header_encode из Drupal (который Вы, судя по представленным Вами заголовкам письма и используете) нет параметров, задающих кодировки.
Ответ написан
NeX
@NeX
pf=permerror (sender IP is X.X.X.X) smtp.mailfrom=test@example.com; dkim=none
настраивайте spf и dkim habrahabr.ru/post/106589/
Ответ написан
romy4
@romy4
Exception handler
Заголовки письма, написанные кодировкой, с отличающимеся от ANSI символоами должны быть записаны специальным образом: =?кодировка?B?тело-заголовка-в-base64?= в соответствии с RFC-1342. На сколько помню, неправильная запись плохо воспринимается outlook
Ответ написан
EugeneOZ
@EugeneOZ
Ой, что Вы мучаетесь. Есть Mandrill с огромным лимитом бесплатных писем, все эти проблемы там сто раз решены. Юзать можно и как smtp, и по API — гораздо проще отправлять вложения и всё такое. Не тратьте время на решение сто раз решённых задач.
Ответ написан
Комментировать
@aggrrrh
При преобразовании из utf-8 там могут быть символы отсутствующие в целевой кодировке. Тогда конвертация останавливается на этом символе. Попробуйте выполнять iconv с параметром //IGNORE
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы