Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
1

Сломалась отправка писем через mail() после переезда на новых хостинг

18.04.2017, 18:56. Показов 3220. Ответов 16

Author24 — интернет-сервис помощи студентам
Коллеги, привет!

Не моуг разобраться с отправкой писем через функцию mail().
Есть старенький небольшой сайтик в кодировке Windows-1251. Работал простенький скрипт по отправке уведомлений с формы обратной связи. Потом сайт переехал на другой хостинг и письма стали приходить с кракозябликами. У меня доступа к хостингу нет, есть только к файлам черех фтп. Менять кодировку сайта на Utf-8 не предлагать, потому что надо вернуть работоспособность как есть.

Может на хостинге другие настройки, которые флияют на mail()?
Файл скрипта, который отправляет письма в кодировке Windows-1251.
Уже пробовал пересохранить файл в UTF-8 и, соответственно, менять кодировку в заголовке на Utf-8. Всё равно приходят на почту иероглифы.

В чём может быть проблема?

Письма отправляются примерно так:
PHP
1
2
3
4
5
6
7
8
9
10
$to = 'admin@site.ru';
$subject = 'Тестовое письмо';
$message = 'Текст сообщения из формы обратной связи';
$headers = "From: Anonymous \r\n Content-type: text/html; charset=windows-1251 \r\n";
 
if(mail($to, $subject, $message, $headers)) {
    echo "Ok";
} else {
    echo "Warning!";
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2017, 18:56
Ответы с готовыми решениями:

Отправка писем через функцию mail();
всем привет!... столкнулся с такой проблемой то, что не могу отправить письма по всей базе данных!...

Отправка писем через функцию mail();
всем привет!... встал вопрос отправки писем по базе зарегистрированных пользователей которые...

Отправка писем через функцию mail(); и решения с ЧС
всем привет! столкнулся с такой проблемой как отправка писем через функцию mail(); и с черным...

Отправка через SMTP писем с mail.ru на yandex.ru
Всем доброго времени суток. На этот раз проблема состоит в следующем: нужно отправить сообщение с...

16
Заблокирован
18.04.2017, 20:44 2
Странно, что это вообще работало. Про кодировку писем читаем тут. Страница с формой, обработчик формы должны быть в кодировке письма, чтобы не усложнять.
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
19.04.2017, 15:20  [ТС] 3
miketomlin, Спасибо за статью. Прочитал по ссылке, сделал как там - не работает. Приходят иероглифы.
Посмотрел на php.net функцию, скопипастил её, сохранил файл в кодировке Utf-8, запустил на хостинге. Письмо приходит, в спам НЕ попадает. Поле "от кого" заполняется правильно. Тема и текст письма в иероглифах. Не пойму в чём причина. Ниже фрагмент кода.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function mail_utf8($to, $from_user, $from_email, $subject = '(No subject)', $message = '')
{ 
    $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
    $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
 
    $headers = "From: $from_user <$from_email>\r\n". 
           "MIME-Version: 1.0" . "\r\n" . 
           "Content-type: text/html; charset=UTF-8" . "\r\n"; 
 
    return mail($to, $subject, $message, $headers); 
}
 
$to             = 'admin@yandex.ru';
$from_user      = 'No-reply';
$from_email     = 'no-reply@site.ru';
$subject        = 'Тест';
$message        = 'Тестовое письмо';
 
if(mail_utf8($to, $from_user, $from_email, $subject, $message)) {
    echo "Ok";
} else {
    echo "Warning!";
}
Страница с формой, обработчик формы должны быть в кодировке письма, чтобы не усложнять.
Потому мне и надо отправлять письма в кодировке windows-1251, потому что сайт и БД в такой кодировке.

Добавлено через 2 часа 11 минут
miketomlin, включил mail.log на хостинге. Вот что выводит при отработке функции, которая в предыдущем моём сообщении.
Кликните здесь для просмотра всего текста
mail() on [/home/directory/test.php:12]: To: admin@yandex.ru -- Headers: From: =?UTF-8?B?Mt8ddsywfk8=?= <no-reply@site.ru> MIME-Version: 1.0 Content-type: text/html; charset=UTF-8 Content-Transfer-Encoding: BASE64

Есть способ посмотреть не только заголовки в логе, но и текст сообщения, который отправляется?

Добавлено через 1 час 46 минут
Есть способ посмотреть не только заголовки в логе, но и текст сообщения, который отправляется?
Нашёл способ — изменить директиву sendmail_path и указать "cat >> /path_to_file/mail.log"
Но директива sendmail_path меняет только в php.ini или httpd.conf, а у меня нет доступа к ним =(
0
Заблокирован
19.04.2017, 15:27 4
Цитата Сообщение от noobie Посмотреть сообщение
Потому мне и надо отправлять письма в кодировке windows-1251, потому что сайт и БД в такой кодировке.
Кто мешает?
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
19.04.2017, 15:32  [ТС] 5
miketomlin, никто не мешает. Столкнулся с трудностями, попытался разобраться — не получилось. Нужна помощь зала.
0
Заблокирован
19.04.2017, 15:38 6
Цитата Сообщение от noobie Посмотреть сообщение
mail_utf8
Содержимое письма тоже нужно кодировать. В статье я показал, как.

Добавлено через 1 минуту
Цитата Сообщение от noobie Посмотреть сообщение
Столкнулся с трудностями, попытался разобраться — не получилось. Нужна помощь зала.
Пока что я вижу, что вы везде суете UTF-8, внося лишний раздрай.
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
19.04.2017, 17:48  [ТС] 7
miketomlin, переписал отправку как в вашей статьей. Всё равно тема письма и само сообщение приходит иероглифами. Не пойму, что не так.
PHP
1
2
3
4
5
6
7
8
9
$to='admin@site.ru';
$subject='=?windows-1251?B?'.base64_encode('Тест').'?=';
$message=chunk_split(base64_encode('Это тестовое сообщение!'));
$headers='From: no-reply@site.ru <no-reply@site.ru>'."\r\n".
         'MIME-Version: 1.0'."\r\n".
         'Content-Transfer-Encoding: base64'."\r\n".
         'Content-Type: text/plain; charset=windows-1251';
 
mail($to,$subject,$message,$headers);
Добавлено через 7 минут
miketomlin, Я так понял, на почту приходит письмо с закодированными темой и текстом сообщения. После обработки строк, которые пришли в сообщении функцией base64_decode() возвращается то, что мы отправляли — тема "Тест" и сообщение "Это тестовое сообщение".
PHP
1
2
3
4
$encoded_subject = '0uXx8g==';
$encoded_message = '3fLuIPLl8fLu4u7lIPHu7uH55e3o5SE=';
print_r(base64_decode($encoded_subject));
print_r(base64_decode($encoded_message));
0
Заблокирован
19.04.2017, 18:55 8
Может, почтовик (ПС/клиент) тупой. Попробуйте отправить на Mail.Ru, Yandex и т.п.

Добавлено через 3 минуты
В Яндекс.Почте можно просмотреть служебные заголовки вместе с «телом письма». Если что-нибудь получите, выложите сюда дамп.
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
20.04.2017, 10:44  [ТС] 9
miketomlin, Я отправлял и на яндекс и на mail.ru. В обоих случаях письма смторел через веб-интерфейс. Результат один и тот же.
Подсмотрел на одном сайте вариант отправки письма, когда сообщение передают не как параметр $message в функцию mail(), а через конкатенацию добавляют к заголовкам и передают в функцию mail() четвёртым парамтером $headers.
Подправил функцию, и текст письма отобразился корректно. Но вот тема сообщения продолжает приходить на почту закодированная в base64.
Ниже немного подправленный код:
PHP
1
2
3
4
5
6
7
8
9
10
$to='admin@yandex.ru';
$subject='=?windows-1251?B?'.base64_encode('Тест').'?=';
$message=chunk_split(base64_encode('Это тестовое сообщение!'));
$headers='From: no-reply@site.ru <no-reply@site.ru>'."\r\n".
         'MIME-Version: 1.0'."\r\n".
         'Content-Transfer-Encoding: base64'."\r\n".
         'Content-Type: text/plain; charset=windows-1251'."\r\n".
         $message;
 
mail($to,$subject, "",$headers);
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.04.2017, 11:10 10
уберите base64 и все
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
20.04.2017, 11:13  [ТС] 11
miketomlin, ниже заголовки писем с яндекса
Когда $message передаю третьим параметром в mail()
Кликните здесь для просмотра всего текста
Received: from mxfront9o.mail.yandex.net ([127.0.0.1])
by mxfront9o.mail.yandex.net with LMTP id hkKGem0r
for <adress@yandex.ru>; Thu, 20 Apr 2017 10:35:12 +0300
Received: from s052d765a.fastvps-server.com (s052d765a.fastvps-server.com [2a03:f480:1:1e::31])
by mxfront9o.mail.yandex.net (nwsmtp/Yandex) with ESMTPS id ohisl16JCZ-ZCMa1lTW;
Thu, 20 Apr 2017 10:35:12 +0300
(using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
(Client certificate not present)
X-Yandex-Front: mxfront9o.mail.yandex.net
X-Yandex-TimeMark: 1492673712
X-Yandex-Spam: 1
Received: from s052d765a.fastvps-server.com (localhost.localdomain [127.0.0.1])
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id v3K7ZBwU020765
for <adress@yandex.ru>; Thu, 20 Apr 2017 10:35:11 +0300
Received: (from www-data@localhost)
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Submit) id v3K7ZBFh020764;
Thu, 20 Apr 2017 10:35:11 +0300
Date: Thu, 20 Apr 2017 10:35:11 +0300
Message-Id: <201704200735.v3K7ZBFh020764@s052d765a.fastvps-server.com>
To: adress@yandex.ru
Subject: =?Windows-1251?B?PT93aW5kb3dzLTEyNTE/Qj8wdVh4?=
=?Windows-1251?B?OGc9PT89?=
X-PHP-Originating-Script: 1004:testMail3.php
From: "no-reply@site.ru" <no-reply@site.ru>
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=windows-1251
Return-Path: www-data@s052d765a.fastvps-server.com
X-Yandex-Forward: e6bbadb0f561a65e712f9bf771e63e0a

M2ZMdUlQTGw4Zkx1NHU3bElQSHU3dUg1NWUzbzVTRT0NCg==


Ниже заголовки, когда, $message добавил к $headers и передал всё четврётрым параметром
Кликните здесь для просмотра всего текста


Received: from mxfront3g.mail.yandex.net ([127.0.0.1])
by mxfront3g.mail.yandex.net with LMTP id k3nirQZg
for <adress@yandex.ru>; Thu, 20 Apr 2017 11:00:04 +0300
Received: from s052d765a.fastvps-server.com (s052d765a.fastvps-server.com [2a03:f480:1:1e::31])
by mxfront3g.mail.yandex.net (nwsmtp/Yandex) with ESMTPS id ohFmJKh69V-03ueriiW;
Thu, 20 Apr 2017 11:00:03 +0300
(using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
(Client certificate not present)
X-Yandex-Front: mxfront3g.mail.yandex.net
X-Yandex-TimeMark: 1492675203
X-Yandex-Spam: 1
Received: from s052d765a.fastvps-server.com (localhost.localdomain [127.0.0.1])
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id v3K8032J021635
for <adress@yandex.ru>; Thu, 20 Apr 2017 11:00:03 +0300
Received: (from www-data@localhost)
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Submit) id v3K803iZ021634;
Thu, 20 Apr 2017 11:00:03 +0300
Date: Thu, 20 Apr 2017 11:00:03 +0300
Message-Id: <201704200800.v3K803iZ021634@s052d765a.fastvps-server.com>
To: adress@yandex.ru
Subject: =?Windows-1251?B?PT93aW5kb3dzLTEyNTE/Qj8wdVh4?=
=?Windows-1251?B?OGc9PT89?=
X-PHP-Originating-Script: 1004:testMail3.php
From: "no-reply@site.ru" <no-reply@site.ru>
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=windows-1251
Return-Path: www-data@s052d765a.fastvps-server.com
X-Yandex-Forward: e6bbadb0f561a65e712f9bf771e63e0a

3fLuIPLl8fLu4u7lIPHu7uH55e3o5SE=


Добавлено через 2 минуты
KOPOJI, Когда убираю в теме base64_encode, то письмо приходит с темой =windows-1251?B??????=
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.04.2017, 11:15 12
Надо же понимать, что у вас в коде творится
Цитата Сообщение от noobie Посмотреть сообщение
PHP
1
$subject='=?windows-1251?B?'.base64_encode('Тест').'?=';
PHP
1
$subject='Тест';
А раз приходит со знаками вопроса - проверьте, что у вас все находится в нужной кодировке
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
20.04.2017, 11:19  [ТС] 13
По заголовкам писем, я так понял, что когда $message передаю третьим параметром, то почему-то строка дважды кодируется в base64. Когда добавляю строку сообщения к $headers и передаю всё четвёртым параметром в mail(), то текст сообщения кодируется только один раз в base64, как и положено.

Добавлено через 3 минуты
KOPOJI, сделал так, приходят одни вопросы. Кодировка файла Windows-1251
PHP
1
2
3
4
5
6
7
8
9
$to='adress@yandex.ru';
$subject='Тест';
$message=chunk_split('Это тестовое сообщение!');
$headers='From: no-reply@site.ru <no-reply@site.ru>'."\r\n".
         'MIME-Version: 1.0'."\r\n".
         'Content-Transfer-Encoding: base64'."\r\n".
         'Content-Type: text/plain; charset=windows-1251';
 
mail($to,$subject, $message, $headers);
Заголовки с яндекса
Кликните здесь для просмотра всего текста
Received: from mxfront10j.mail.yandex.net ([127.0.0.1])
by mxfront10j.mail.yandex.net with LMTP id aiJZPLyi
for <adress@yandex.ru>; Thu, 20 Apr 2017 11:18:23 +0300
Received: from s052d765a.fastvps-server.com (s052d765a.fastvps-server.com [2a03:f480:1:1e::31])
by mxfront10j.mail.yandex.net (nwsmtp/Yandex) with ESMTPS id h9Qf0OZk9Z-INgClqM1;
Thu, 20 Apr 2017 11:18:23 +0300
(using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
(Client certificate not present)
X-Yandex-Front: mxfront10j.mail.yandex.net
X-Yandex-TimeMark: 1492676303
X-Yandex-Spam: 1
Received: from s052d765a.fastvps-server.com (localhost.localdomain [127.0.0.1])
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id v3K8IM6L022394
for <adress@yandex.ru>; Thu, 20 Apr 2017 11:18:22 +0300
Received: (from www-data@localhost)
by s052d765a.fastvps-server.com (8.14.4/8.14.4/Submit) id v3K8IMYS022393;
Thu, 20 Apr 2017 11:18:22 +0300
Date: Thu, 20 Apr 2017 11:18:22 +0300
Message-Id: <201704200818.v3K8IMYS022393@s052d765a.fastvps-server.com>
To: adress@yandex.ru
Subject: =?Windows-1251?B?Pz8/Pw==?=
X-PHP-Originating-Script: 1004:testMail3.php
From: "no-reply@site.ru" <no-reply@site.ru>
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=windows-1251
Return-Path: www-data@s052d765a.fastvps-server.com
X-Yandex-Forward: e6bbadb0f561a65e712f9bf771e63e0a

Pz8/ID8/Pz8/Pz8/ID8/Pz8/Pz8/PyENCg==

0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.04.2017, 11:23 14
И в заголовке, и в сообщении?
http://php.net/manual/ru/funct... encode.php пробовали использовать?
0
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
20.04.2017, 12:09  [ТС] 15
KOPOJI, попробовал тему пропустить через эту функцию — то же самое, приходит на почту в теме текст вида Subject: =?windows-1251?B?0uXx8g==?=
PHP
1
2
3
4
5
6
$preferences = array(
    'scheme'            => 'B',
    'input-charset'     => 'windows-1251',
    'output-charset'    => 'windows-1251',
);
mail($to, iconv_mime_encode("Subject", $subject, $preferences), $message, $headers);
0
Заблокирован
20.04.2017, 14:43 16
Цитата Сообщение от noobie Посмотреть сообщение
ниже заголовки писем с яндекса
Subject кривой:
Код
Subject: =?Windows-1251?B?PT93aW5kb3dzLTEyNTE/Qj8wdVh4?=
=?Windows-1251?B?OGc9PT89?=
В первой строке в самом коде закодировано =?Windows-1251?B?... До появления второй строки лучше вообще не доводить и синтаксис походу неправильный: как я писал в статье, вторая и послед. строки должны начинаться с \s, может еще \t прокатит. У вас либо где-то на лету происходит кодирование значения Subject, либо вы дважды оборачиваете «конфету в обертку», сами того не замечая.

$message указывайте в третьем параметре ф-ции, как положено, т.к. почтовик может после ваших заголовков добавить свои, что приведет к кривизне (ваши заголовки, сообщение, доп заголовки), а кроме того, перед телом сообщения должна идти пустая строка – это на будущее, когда в действительности понадобится вручную объединять заголовки с телом сообщения.

Добавлено через 20 минут
Код из 7-го поста у меня работает (на мэйл и на яндекс приходит нормальное письмо), правда, я взял оттуда только данные и подставил в свою песочницу:

subject
Код
=?windows-1251?B?0uXx8g==?=
headers
Код
From: noreply@gte-to-tam.ru
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=windows-1251
message
Код
3fLuIPLl8fLu4u7lIPHu7uH55e3o5SE=
1
6 / 6 / 1
Регистрация: 28.01.2016
Сообщений: 40
26.04.2017, 12:33  [ТС] 17
miketomlin, снова вернулся к решению этого вопроса. Проблема решилась. В самое начало скрипта, который генерирует страницу отправки писем добавил строчку и письмо отправилось без дополнительной правки скрипта:
PHP
1
mb_internal_encode('Windows-1251);
);

Вызов функции mb_internal_encode() возвращал значение ISO-8859-1.

Не пойму причину, из-за которой всё сломалось и письмо уходило в неправильно кодировке. Сами файлы скриптов сохранены в windows-1251.
Получается, что перед отправкой письму текст кодировался в другую кодировку, но так как в заголовке я указывал charset=windows-1251, указанная кодировка не соответствовала фактической. Поэтому приходили знаки ???? вместо текста.

phpinfo() показал, что кодировка ISO-8859-1 указана по умолчанию в следующих параметрах:
PHP
1
2
3
iconv.input_encoding
iconv.internal_encoding
iconv.output_encoding
Можете пояснить, как это могло повлиять на отправку письма и что именно послужило причиной кривой отправки?
0
26.04.2017, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2017, 12:33
Помогаю со студенческими работами здесь

Ошибка в строке после переезда на новый хостинг
Прошу помочь. Хостер написал, что есть ошибка: PHP Parse error: syntax error, unexpected '500'...

После переезда на другой хостинг не определяется запрос AJAX
Перенес сайт на свой хостинг (ubuntu, apache, php, mysql) сам сайт работает, но запросы...

После переезда на другой хостинг не работает форма обратной связи
Всем привет. Возникла небольшая проблема. PHP я не знаю, но форму обратной связи делал для своего...

Отправка писем по E-Mail
Получаю такой текст ошибки: Сервер отклонил один или несколько адресов получателей. Отклик...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru