Кодировка в e-mail без зябриков
Проблема:
С сайта осуществляется рассылка кириллицей!
Как сделать так, чтобы пользователи в разных странах (Германия, США, Польша и проч.) могли читать кириллицей, а не выводились зябрики?! Как правильно сделать кодировку?!
Не бейте сильно, если это оффтоп!!
UTF-8 кодировку использовать
Цитата: mfender
UTF-8 кодировку использовать
А можно поподробнее, уважаемый mfender.. Где и в каком месте кода внедрить кодировку?!
А точно все импортные жители :) смогут читать кириллицей?!
Код:
$charset = "utf-8";
$header = "Content-Type: text/html; charset=$charset\r\n";
mail($email, $theme, $text, $header);
$header = "Content-Type: text/html; charset=$charset\r\n";
mail($email, $theme, $text, $header);
Но есть одна накладка! А именно поле ТЕМА в письме.
Итак, при использовании utf-8 что мы имеем:
1. В OUTLOOK EXPRESS MSOFFICE RUS - тема отображается
2. На всех остальных версиях outlook, The Bat в поле тема - ?????????????
3. Если проверить ящик через майл.ру - там тема вообще пустая!
4. На почтовых серверах заграницей не проверялось.
Отсюда вопрос: Как эту пакость побороть?!
Привожу пример кода:
.........
$headers_abon = "From: [email]admin@ххх.ru[/email]\n";
$headers_abon .="X-Mailer: PHP/" . phpversion();
$headers_abon .="MIME-Version: 1.0\n";
$headers_abon .="Content-Type: text/plain; charset=utf-8\n";
$headers_abon .="Content-Transfer-Encoding: 8bit";
...........
далее идет текст сообщений и прочее. Сама страница в кодировке utf-8/
Помогите, плз!!!
А тема фактически в какой кодировке написана?
1. Письмо может быть в любой кодировке, главное правильно указать ее в Content-Type
2. Subject должен быть закодирован в Quoted-Printable или Base64
Вот пример QP-кодирующей функции:
Код:
function qp_enc( $input = "", $line_max = 76, $space_conv = true ) {
GLOBAL $LANG;
$hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
$eol = "?=\r\n\t";
$escape = "=";
$output = "";
$charset = "=?".$LANG["charset"]."?Q?";
while( list(, $line) = each($lines) ) {
$linlen = strlen($line);
$newline = "";
for($i = 0; $i < $linlen; $i++) {
$c = substr( $line, $i, 1 );
$dec = ord( $c );
if ( ( $i == 0 ) && ( $dec == 46 ) ) {
$c = "=2E";
}
if ( $dec == 32 ) {
if ( $i == ( $linlen - 1 ) ) {
$c = "_";
} else if ( $space_conv ) {
$c = "_";
}
} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
$h2 = floor($dec/16);
$h1 = floor($dec%16);
$c = $escape.$hex["$h2"].$hex["$h1"];
}
if ( (strlen($newline) + strlen($c)) >= $line_max ) {
$output .= $charset.$newline.$eol;
$newline = "";
if ( $dec == 46 ) {
$c = "=2E";
}
}
$newline .= $c;
} // end of for
$output .= $charset.$newline.$eol;
} // end of while
return trim(str_replace("\r\n","\n",$output));
}
GLOBAL $LANG;
$hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
$eol = "?=\r\n\t";
$escape = "=";
$output = "";
$charset = "=?".$LANG["charset"]."?Q?";
while( list(, $line) = each($lines) ) {
$linlen = strlen($line);
$newline = "";
for($i = 0; $i < $linlen; $i++) {
$c = substr( $line, $i, 1 );
$dec = ord( $c );
if ( ( $i == 0 ) && ( $dec == 46 ) ) {
$c = "=2E";
}
if ( $dec == 32 ) {
if ( $i == ( $linlen - 1 ) ) {
$c = "_";
} else if ( $space_conv ) {
$c = "_";
}
} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) {
$h2 = floor($dec/16);
$h1 = floor($dec%16);
$c = $escape.$hex["$h2"].$hex["$h1"];
}
if ( (strlen($newline) + strlen($c)) >= $line_max ) {
$output .= $charset.$newline.$eol;
$newline = "";
if ( $dec == 46 ) {
$c = "=2E";
}
}
$newline .= $c;
} // end of for
$output .= $charset.$newline.$eol;
} // end of while
return trim(str_replace("\r\n","\n",$output));
}
Майк, я как раз спрашивал к тому, не в UTF-8 ли у него и заголовок :)
Итак...
У меня есть файл РНР, отвечающий за отправку письма. Написан в стандартном виндозном блокноте. Кодировка всего файла - UTF-8.
В нём написано:
<?php
$subject="Привет от меня!";
$mail = "ххх@mail.ru";
$message = "Тестовое сообщение";
$headers_abon = "From: [email]admin@ххх.ru[/email]\n";
$headers_abon .="X-Mailer: PHP/" . phpversion();
$headers_abon .="MIME-Version: 1.0\n";
$headers_abon .="Content-Type: text/plain; charset=utf-8\n";
$headers_abon .="Content-Transfer-Encoding: 8bit";
$send_abon = mail($mail, $subject, $message, $headers_abon);
?>
Вот полный листинг кода-файла в кодировке UTF-8.
Где я ламер?!
Господа, не пинайте меня... Я учусь... Прошу помочь... Пожалуйста!!!
З.Ы.: Виндозный русский outlook тоже понимает тему (см. п.выше), а все остальное - The Bat (русс), ww.mail.ru и проч. почт. серверы пишут ???? либо поле ТЕМА пустая...
Помогите, прошу Вас!!!
Очень прошу!!!
Цитата: 4айник
Гуру!!! Уважаемые гуру!!! Помогите, прошу Вас!!! Очень прошу!!!
4айник, вы, наверное, уже разобрались в проблеме. может, поделитесь своим решением ?
И еще, коллеги, когда говорите о проблемах с письмами, то кроме примера кода обязательно публикуйте заголовки письма (headers) - по ним гораздо проще разобраться в проблеме, чем по исходникам программы, их генерируещей.
Проблемы очень сильные, особенно, если почтовый сервер иностранцев работает по 7bit шифрованию.
Может быть, вы что-то не так оформляете в заголовках ?
Покажите заголовки письма.
Можно в аську 46297588
Может что-то упустил...
Или модераторы разрешат здесь продолжить ?
По твоему коду base64_encode($subject) ничего точно нельзя сказать.
Если в $subject у тебя лежит текст не в utf-8, это конечно будет причиной проблемы. Еще может быть проблема с длиной строки.
Покажи сгенерированное письмо полностью. Или хотя бы заголовки. На коды будем смотреть потом.
Подходящие Команды:
iconv();
mb_convert_encoding();
Проверь - все ли поля идут в правильной кодировке.
Обрати внимание на надпись Subject в заголовке писем.
Вот к примеру я сейчас дёрнул строку у себя в зебате из письма:
Subject: =?windows-1251?q?=C4=EE=E1=F0=EE_=EF=EE=E6=E0=EB=EE=E2=E0=F2=FC_=ED=E0_CodeNet_Forum!?=
Реально написано в теме: Добро пожаловать на CodeNet Forum!
Я смотрю: Д=C4, о=EE, б=E1, р=F0
Вот и ищи, как конвертнуть(дать в хедер) UTF-8 кодировку.
Просто отправь себе письмо в кодировке UTF-8 каким-неть почтовиком и раскопай его заголовок. Всё сразу станет понятно.
Цитата:
Попробуй сконвертить ТЕМУ
2: 4айник
Во-во, юзай mb, у меня тож такая проблема была когда-то.