Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
 Аватар для Kazachek
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 405

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

27.09.2016, 15:31. Показов 5442. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2016, 15:31
Ответы с готовыми решениями:

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

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

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

8
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
27.09.2016, 17:24
Добавьте в письмо заголовок
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
 Аватар для Kazachek
18 / 18 / 8
Регистрация: 03.11.2013
Сообщений: 405
27.09.2016, 17:37  [ТС]
Цитата Сообщение от Пифагор Посмотреть сообщение
Добавьте в письмо заголовок
Добавил указанный код в заголовок. Письмо отправилось, но в виде текста.

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

-----
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==?=

iVBORw0KGgoAAAANSUhEUgAAAVIAAABfCAYAAAC6 PE+FAAAKN2lDQ1BzUkdCIElFQzYxOTY2LTIu
MQAAeJydlndUU9kWh8+9N71QkhCKlNBraFICSA29 SJEuKjEJEErAkAAiNkRUcERRkaYIMijggKND
kbEiioUBUbHrBBlE1HFwFBuWSWStGd+8ee/Nm98f935rn73P3Wfvfda6AJD8gwXCTFgJgAyhWBT h
58WIjYtnYAcBDPAAA2wA4HCzs0IW+EYCmQJ82Ixs mRP4F726DiD5+yrTP4zBAP+flLlZIjEAUJiM
5/L42VwZF8k4PVecJbdPyZi2NE3OMErOIlmCMlaTc/IsW3z2mWUPOfMyhDwZy3PO4mXw5Nwn4405
Er6MkWAZF+cI+LkyviZjg3RJhkDGb+SxGXxONgAo ktwu5nNTZGwtY5IoMoIt43kA4EjJX/DSL1jM
zxPLD8XOzFouEiSniBkmXFOGjZMTi+HPz03ni8XM MA43jSPiMdiZGVkc4XIAZs/8WRR5bRmyIjvY
ODk4MG0tbb4o1H9d/JuS93aWXoR/7hlEH/jD9ld+mQ0AsKZltdn6h21pFQBd6wFQu/2HzWAvAIqy
0
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
27.09.2016, 17:43
Лучший ответ Сообщение было отмечено 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
930 / 846 / 190
Регистрация: 28.11.2013
Сообщений: 3,621
27.09.2016, 18:02
Пифагор, это не поможет избавиться от вылезших заголовков.

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
P.S. А вообще лучше почитайте про file_get_contents.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2016, 15:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru