LINUX.ORG.RU

[php][sendmail] кодировка, нетривиальное

 ,


0

1

Где на пути apache > php > sendmail может быть выставлена кодировка, кроме как в самом скрипте? В гугле «php mail utf-8» гуглится легко, но все примеры выдают полный треш.

Так же обрушились все старые скрипты отправки почты, посылая вместо русского CP1252, но когда этот момент произошёл - пропустил.

Сам файл скрипта utf-8, никаких ужасов в php.ini не нашёл. Куда копать ещё можно? sendmail сам ведь кодировку не выберет, в апаче - utf-8 дефолт.

Согласен с предыдущим комментарием.
P.s. рекомендую использовать swift mailer.

impr
()
Ответ на: комментарий от visual

Не, не слабо:


$to = 'мыло@мыло.мы'; 
$subject = 'Тест'; 
$message = 'Тест-тест'; 
$headers = "From: server@example.com\r\n" . 
        'X-Mailer: PHP/' . phpversion() . "\r\n" . 
        "MIME-Version: 1.0\r\n" . 
        "Content-Type: text/html; charset=utf-8\r\n" . 
        "Content-Transfer-Encoding: 8bit\r\n\r\n"; 

// Send 
mail($to, $subject, $message, $headers); 

Результат:

Mime-Version: 1.0 Тест-тест

alexmaru
() автор топика
Ответ на: комментарий от visual

смахивает на utf8 в utf8

но если отсылать, перекировав текст в win-1251, лебедевский декодер говорит «1252»

alexmaru
() автор топика

Ты это на локалхосте ловишь? У меня вчера весь день были проблемы, тоже кодировка ломалась, перетащили на реальный хостинг - все работает идеально.

P.S. Ошибку так и не нашли.

mopsene ★★★
()
Ответ на: комментарий от alexmaru

добавляем в заголовки «Content-Transfer-Encoding: base64» вместо 8bit, отправляем сообщение так: mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', base64_encode($message), $headers), всё работает =)

xapienz
()
Ответ на: комментарий от xapienz

У меня остались смутные воспоминания о каком-то выравнивании...

r2d2
()
Ответ на: комментарий от xapienz

$subject = 'Тест'; 
$message = 'Тест-теdsdст'; 
$headers =  
	        "Content-Type: text/html; charset=utf-8\r\n" . 
	        "Content-Transfer-Encoding: base64\r\n"; 

// Send 
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', base64_encode($message), $headers);

Оно же? Тут негде ошибится. Без контент-тайп пробовал. И таки =?UTF-8?B?0KLQtdGB0YI=?= в заголовке и в сообщении 0KLQtdGB0YIt0YLQtWRzZNGB0YI=

Кто-то там не читает заголовок. Переводы строк? Аль ещё чего?

alexmaru
() автор топика
Ответ на: комментарий от alexmaru

Странно, только что именно это запустил, письмо пришло нормально. Гмейл распарсил. Рамблер тоже в такой форме показывает правильно. Может быть, здесь почтовое приложение не может правильно распарсить base64 (не умеет?).

xapienz
()
Ответ на: комментарий от alexmaru

что выдаётся в «Показать оригинал» внизу?

у меня такое:

<...>
To: ******@gmail.com
Subject: =?UTF-8?B?0KLQtdGB0YI=?=
X-PHP-Originating-Script: 1004:mail.php
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
Message-Id: <20120207220006.C1ABF307B5@******>
Date: Wed,  8 Feb 2012 02:00:06 +0400 (MSK)
From: apache@****** (added by portage for apache)

0KLQtdGB0YIt0YLQtWRzZNGB0YI=

и сообщение показывается русскими буквами

xapienz
()
Ответ на: комментарий от kelyar

У них локалхост общий. Не веришь - попроси их сверить айпишники локалхостов :)

xapienz
()
Ответ на: комментарий от xapienz
Delivered-To: мояпочтакудапришло@gmail.com
Received: by 10.231.146.12 with SMTP id f12cs165283ibv;
        Tue, 7 Feb 2012 13:56:28 -0800 (PST)
Received: by 10.204.151.207 with SMTP id d15mr11440729bkw.27.1328651788011;
        Tue, 07 Feb 2012 13:56:28 -0800 (PST)
Return-Path: <apache@мойдомен.ру>
Received: from мойдомен.ру ([89.108.110.79])
        by mx.google.com with ESMTPS id ua10si11019840bkb.148.2012.02.07.13.56.27
        (version=TLSv1/SSLv3 cipher=OTHER);
        Tue, 07 Feb 2012 13:56:27 -0800 (PST)
Received-SPF: neutral (google.com: 89.108.110.79 is neither permitted nor denied by best guess record for domain of apache@мойдомен.ру) client-ip=89.108.110.79;
Authentication-Results: mx.google.com; spf=neutral (google.com: 89.108.110.79 is neither permitted nor denied by best guess record for domain of apache@мойдомен.ру) smtp.mail=apache@мойдомен.ру
Received: from мойдомен.ру (мойдомен.ру [127.0.0.1])
	by мойдомен.ру (8.14.4/8.14.2) with ESMTP id q17LuQ6p026574
	for <мояпочтакудапришло@gmail.com>; Tue, 7 Feb 2012 23:56:26 +0200
Received: (from apache@localhost)
	by мойдомен.ру (8.14.4/8.14.4/Submit) id q17LuQRR026573;
	Tue, 7 Feb 2012 23:56:26 +0200
Date: Tue, 7 Feb 2012 23:56:26 +0200
From: Apache <apache@мойдомен.ру>
Message-Id: <201202072156.q17LuQRR026573@мойдомен.ру>
To: мояпочтакудапришло@gmail.com
Subject: =?UTF-8?B?PT9VVEYtOD9CPzBLTFF0ZEdCMFlJPT89?=
Content-Transfer-Encoding: base64 
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8

0KLQtdGB0YIt0YLQtdGB0YI=

У меня длиннее :-)

alexmaru
() автор топика
Ответ на: комментарий от alexmaru

а теперь запусти именно это на свой и на мой ящик, хочу сравнить письма с одинаковыми входными данными:

<?php
$to = 'ящик@gmail.com';
$subject = 'Тест';
$message = 'Тест-теdsdст';
$headers =
                "Content-Type: text/plain; charset=utf-8\r\n" .
                "Content-Transfer-Encoding: base64\r\nMime-Version: 1.0";

// Send
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', base64_encode($message), $headers);
?>

xapienz
()
Ответ на: комментарий от alexmaru

да, у меня от тебя тоже не раскодированные сообщения

xapienz
()
Ответ на: комментарий от alexmaru

странно, у тебя base64_encode дважды закодировал сообщение оО. от тебя я получил вот это:

<...>
To: temp_mailbox@xapienz.ru
Subject: =?UTF-8?B?PT9VVEYtOD9CPzBLTFF0ZEdCMFlJPT89?=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
Mime-Version: 1.0
Mime-Version: 1.0

MEtMUXRkR0IwWUl0MFlMUXRXUnpaTkdCMFlJPQ==

что интересно:

$ echo MEtMUXRkR0IwWUl0MFlMUXRXUnpaTkdCMFlJPQ== | base64 -d
0KLQtdGB0YIt0YLQtWRzZNGB0YI=

$ echo 0KLQtdGB0YIt0YLQtWRzZNGB0YI= | base64 -d
Тест-теdsdст

то есть пришло base64_encode(base64_encode($message));

xapienz
()
Ответ на: комментарий от xapienz

ну вот собственно и вопрос: кто ещё может быть посредником при отсылке?

alexmaru
() автор топика
Ответ на: комментарий от mopsene

так кто, кроме php и sendmail может перекодировать почту ещё раз?

alexmaru
() автор топика

To: моё-мыло Subject: =?UTF-8?B?w5DCosOQwrXDkcKBw5HCgg==?= Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: BASE64

w5DCosOQwrXDkcKBw5HCgi3DkcKCw5DCtWRzZMORwoHDkcKC

Даже, если вообще ничего не указать. Где это жёстко задаётся? Сейчас посылаю через php-cli, то есть, по идее, это прямой путь через sendmail

alexmaru
() автор топика
Ответ на: комментарий от alexmaru

Это какой-то из параметров в php.ini

Взял чистый конфиг, настроил всё по новой — всё нормально, и посылает сразу в UTF-8.

alexmaru
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.