Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 404
1

Не получается отправить письмо с русскими буквами

27.09.2016, 15:31. Просмотров 1934. Ответов 8
Метки нет (Все метки)


Добрый день, есть php файл с функцией отправки письма. Кодировка 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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?
 
$name=$_FILES['logotype']['name'];
$tmp_name = $_FILES['logotype']['tmp_name'];
$file1_size = $_FILES['logotype']['size']; 
$file1_type = $_FILES['logotype']['type']; 
$location='./sendedmails/';
 
$dlina_name=strlen($name);
$format_name=substr($file1_type, 6);
#--------------------------------------------------
$date_today = date("dmy"); 
        $today[1] = date("His");
        $items22 = (string)($date_today);
        $items23 = strval($today[1]);
        $plus2=$items22.$items23;
        $news_icon = $plus2.".".$format_name;
    if (move_uploaded_file($tmp_name, $location.$news_icon)){
        $step_to_send="1";
    
    }else{
        $step_to_send="0";
        echo "<div style='width:560px;height:300px; text-align: center; padding-top:40px;position:absolute; top:200px; left:50%; margin-left:-230px; color:#be0438;'> 
        <b>Ошибка!<br>Не удалось добавить данные.<br><br>Проверьте правильность ввода данных и фотографии<br></b><a href ='slides.php'>На главную</a></div>";
    }
 
 
 
 
 
 
 
##########################################################################################
 
 
 
$file = $location.$news_icon; // файл
$mailTo = "komu@mail.ru"; // кому
$from = "otkogo@mail.ru"; // от кого
$subject = "New request in web site olamcom.ru"; // тема письма
$message = "Новое обращение от посетителя"; // текст письма
#$message = iconv('utf-8','windows-1251', $message); //попытка изменения кодировки
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
 
/**
* Отправка письма с вложением
* @param string $mailTo
* @param string $from
* @param string $subject
* @param string $message
* @param string|bool $file - не обязательный параметр, путь до файла
* 
* @return bool - результат отправки
*/
 
function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
    $separator = "---"; // разделитель в письме
    // Заголовки для письма
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "From: $from\nReply-To: $from\n"; // задаем от кого письмо
    $headers .= "Content-Type: multipart/mixed; boundary=\"$separator\""; // в заголовке указываем разделитель
    // если письмо с вложением
    if($file){
        $bodyMail = "--$separator\n"; // начало тела письма, выводим разделитель
        $bodyMail .= "Content-type: text/html; charset='utf-8'\n"; // кодировка письма
        $bodyMail .= "Content-Transfer-Encoding: quoted-printable"; // задаем конвертацию письма
        $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n"; // задаем название файла
        $bodyMail .= $message."\n"; // добавляем текст письма
        $bodyMail .= "--$separator\n";
        $fileRead = fopen($file, "r"); // открываем файл
        $contentFile = fread($fileRead, filesize($file)); // считываем его до конца
        fclose($fileRead); // закрываем файл
        $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=\n"; 
        $bodyMail .= "Content-Transfer-Encoding: base64\n"; // кодировка файла
        $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n";
        $bodyMail .= chunk_split(base64_encode($contentFile))."\n"; // кодируем и прикрепляем файл
        $bodyMail .= "--".$separator ."--\n";
    // письмо без вложения
    }else{
        $bodyMail = $message;
    }
    $result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
    return $result;
}
 
 
?>
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2016, 15:31
Ответы с готовыми решениями:

Отправить письмо с русскими буквами
Приветствую, помогите пожалуйста разобраться с кодировками. Задача в том чтобы можно было через...

Не получается написать индекс с русскими буквами
Здравствуйте. Пытаюсь написать индекс с русскими буквами и не получается. L1ГР Выделяет ГР красным...

Не получается отправить письмо
Здравствуйте, форумчане. Столкнулся с проблемой: не получается отправить письмо на емайл. На...

Не получается отправить письмо
idSmtp1.Host := 'SMTP.yandex.ru'; idSmtp1.Port := 25; idSmtp1.Username := 'po4ta0019'; ...

8
1639 / 1305 / 639
Регистрация: 10.01.2015
Сообщений: 4,283
27.09.2016, 17:24 2
Добавьте в письмо заголовок
PHP
1
$headers = "Content-type: text/plain; charset=utf-8\r\n";
Пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
function mail_utf8($to, $from, $subject, $message)
{
    $subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
 
    $headers  = "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-type: text/plain; charset=utf-8\r\n";
    $headers .= "From: $from\r\n";
 
    return mail($to, $subject, $message, $headers);
}
 
// пример использования
mail_utf8('to-user@gmail.com', 'no-reply@example.ru', 'Заголовок сообщения', 'Текст сообщения');
1
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 404
27.09.2016, 17:37  [ТС] 3
Цитата Сообщение от Пифагор Посмотреть сообщение
Добавьте в письмо заголовок
Добавил указанный код в заголовок. Письмо отправилось, но в виде текста.

Кликните здесь для просмотра всего текста

-----
Content-type: text/html; charset='utf-8'
Content-Transfer-Encoding: quoted-printableContent-Disposition: attachment; filename==?utf-8?B?MjcwOTE2MTcyOTQxLnBuZw==?=

Новое обращение от посетителя
-----
Content-Type: application/octet-stream; name==?utf-8?B?MjcwOTE2MTcyOTQxLnBuZw==?=
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename==?utf-8?B?MjcwOTE2MTcyOTQxLnBuZw==?=

iVBORw0KGgoAAAANSUhEUgAAAVIAAABfCAYAAAC6PE+FAAAKN2lDQ1BzUkdC IElFQzYxOTY2LTIu
MQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjEJEErAkAAiNkRU cERRkaYIMijggKND
kbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBTh
58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82IxsmRP4F726DiD5+yrTP4zB AP+flLlZIjEAUJiM
5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405
Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAoktwu5nNTZGwtY5IoMoIt 43kA4EjJX/DSL1jM
zxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XMMA43jSPiMdiZGVkc4XIA Zs/8WRR5bRmyIjvY
ODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqy
0
1639 / 1305 / 639
Регистрация: 10.01.2015
Сообщений: 4,283
27.09.2016, 17:43 4
Лучший ответ Сообщение было отмечено Kazachek как решение

Решение

Замените plain на html.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
function mail_utf8($to, $from, $subject, $message)
{
    $subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
 
    $headers  = "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: $from\r\n";
 
    return mail($to, $subject, $message, $headers);
}
 
// пример использования
mail_utf8('to-user@gmail.com', 'no-reply@example.ru', 'Заголовок сообщения', 'Текст сообщения');
1
Заблокирован
27.09.2016, 18:02 5
Пифагор, это не поможет избавиться от вылезших заголовков.

Kazachek, зачем вы к основному содержимому Content-Disposition прилепили? И спеки почитайте – разделителем строк является "\r\n", а не то что у вас, хотя в никсах такое возможно, т.к. в ряде случаев делается прозрачная подмена \n на \r\n, но у вас все равно как-то криво, потому что в первом случае вы использовали один разделитель, а далее уже др.

Добавлено через 4 минуты
И Хде quoted-printable-кодирование, коли оно объявлено?
1
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 404
28.09.2016, 09:02  [ТС] 6
Цитата Сообщение от miketomlin Посмотреть сообщение
зачем вы к основному содержимому Content-Disposition прилепили?
Использую готовый скрипт, так как принцип создания сам не понял и не смог самостоятельно написать((

Добавлено через 1 час 3 минуты
Пифагор,
Добавил в заголовок, почему то письмо пустым отправлялось.
Потом добавил к телу письма получилось. Огромное спасибо.
PHP
1
$bodyMail .= "Content-type: text/html; charset=utf-8\r\n";
Вы случайно не можете подсказать, как можно отправить файл который находится в временной папке не перемещая его в директории сервера.

Понимаю один вопрос одна тема, но я уже создал тему, то нам не получил нужного ответа. Прошу прощения у всех. Огромное спасибо всем за помощь.
0
Заблокирован
28.09.2016, 13:21 7
Я вам на основной вопрос ответил. Хотя что мешало самому проверить, можно или нет, не понятно. Что касается вашего последнего вопроса, неужто сами не можете догадаться, как состыковать tmp_name с функцией чтения файла?
0
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 404
28.09.2016, 13:48  [ТС] 8
Цитата Сообщение от miketomlin Посмотреть сообщение
неужто сами не можете догадаться, как состыковать tmp_name с функцией чтения файла?
Огромное спасибо вам за старание помочь.
Думаете мне приятно отвлекать всех тем что я сам знаю?
Незнаю по этому спрашиваю у тех кто знает и надеюсь на их помощь что нормально без сарказма помогут.

как я понял tmp_name это временное название файла. Является ли оно так же файлом или это только название?

мне всего лишь нужно указать, как поставить вот в эту часть кода, тот файл который передался пост запросом не перемещая его в директорию.

PHP
1
$file = $location.$news_icon;
0
Заблокирован
28.09.2016, 15:50 9
Цитата Сообщение от Kazachek Посмотреть сообщение
как я понял tmp_name это временное название файла. Является ли оно так же файлом или это только название?
Название по определению файлом не является, оно является названием файла, т.е. именем, причем полным

Цитата Сообщение от Kazachek Посмотреть сообщение
Думаете мне приятно отвлекать всех тем что я сам знаю?
Т.е. вы лепете код абсолютно бездумно? Это крайне опасно, особенно в Web-разработке! У вас выше был фрагмент кода для чтения файла, не самый компактный, но в принципе годный. Подставьте в этот код tmp_name.

Добавлено через 2 минуты
P.S. А вообще лучше почитайте про file_get_contents.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2016, 15:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Не получается отправить письмо
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Не получается отправить письмо
Добрый день. Стоит задача выполнить синхронизацию папки на сервере (windows 2008 server 32bit) с...

Не получается отправить письмо mail()
Привет всем. Недавно я решил немного подучить PHP, в общем стало интересно как отправить письмо...

Не получается отправить письмо. Не пойму в чем ошибка
Вот мой код. Не пойму в чем дело, можете помочь разобраться? string mailAssignedTo...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.