Кодировка русских символов в письме — подскажите

Всем здравствуйте! Я программист, но не PHP (общий код понимаю) но синтаксис очень хромает. Поручили разовую задачу — на сайте должна быть форма с обращением + прикреплять файлы. Перерыл по теме форм обратной связи много различных сайтов и вот что получилось (допилил найденный пример на сколько хватило мозгов). Сильно не ругайте, пианист играет как может… Форма отправляем заданное количество прицепленных файлов (без загрузки на сайт), но что-то с кодировкой самих файлов (не открываются потом) и с кодировкой текста сообщения (русские буквы все пропадают), имена самих файлов по русски приходят нормально. Я понимаю, что есть примеры — но не смог прикрутить (выпадает в ошибки) — повторюсь, что синтаксис хромает. Советы типа phpmailer и т.п. не принимаются — нужна именно функция php mail() — далее еще будет функционал дописан. Прошу мудрых советов! Заранее благодарен! Всем удачи!

<meta charset=»UTF-8″>
<form action=»#» method=»POST» enctype=»multipart/form-data» >
<input type=»file» name=»img_file[]» style=»width: 100%;»>
<br/>
<input type=»file» name=»img_file[]» style=»width: 100%;»>
<br/>
<input type=»file» name=»img_file[]» accept=».jpg,.jpeg,.png» style=»width: 100%;»>
<br/>
<input type=»submit» name=»upload» value=»Отправить» />
<br/>
</form>

<?php
if($_POST) {
$to = «mymail@mail.ru»; //Кому
$from = «def@gmail.com»; //От кого
$subject = «Обращение с сайта»; //Тема
$message = «Это текст по русски 8888888888888889999999999999999999999999999999»; //Текст самого обращения
$boundary = «—«; //Разделитель
/* Заголовки */
$headers = «From: $from\nReply-To: $from\n»;
$headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»»;
$body = «—$boundary\n»;
/* Присоединяем текстовое сообщение */
$body .= «Content-type: text/html; charset=’utf-8’\n»;
$body .= «Content-Transfer-Encoding: quoted-printablenn»;
$body .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode(«»).»?=\n\n»; // обязательная строка иначе нет текста сообщения
$body .= $message.»\n»;

for($i=0; $i < count($_FILES[‘img_file’][‘name’]); $i++)
{
if ($_FILES[‘img_file’][‘name’][$i] != «») { // не записываем в массив пустые (не выбранные файлы)
$ftype[] = $_FILES[‘img_file’][‘type’][$i];
$fname[] = $_FILES[‘img_file’][‘name’][$i];
//print($_FILES[‘img_file’][‘name’][$i]);
}
}

// массив с имена файлов для отправки
$files = $fname;
// прицепляем файлы
for($x=0; $x<count($files); $x++) {
$filename = $files[$x];
$body .= «—$boundary\n»;
$file = fopen($filename, «r»); //Открываем файл
$text = fread($file, filesize($filename)); //Считываем весь файл
fclose($file); //Закрываем файл
/* Добавляем тип содержимого, кодируем текст файла и добавляем в тело письма */
$body .= «Content-Type: image/jpeg; name==?utf-8?B?».base64_encode($filename).»?=\n»;
$body .= «Content-Transfer-Encoding: base64\n»;
$body .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode($filename).»?=\n\n»;
$body .= chunk_split(base64_encode($text)).»\n»;
}
$body .= «—» . $boundary . «—\n»;
/* Отправляем письмо */
if (mail($to, $subject, $body, $headers)) print(‘Go mail’);
else print(‘Problems…’);
}
?>

 

Хотелось бы знать, какие ошибки выдаёт пхп? Скриншот сделать можешь?

 

Нашел в комментариях к коду (откуда сдернул) что:
$body .= «Content-Transfer-Encoding: quoted-printablenn»;
надо заменить на:
$body .= «Content-Transfer-Encoding: quoted-printable\n\n»;

Ошибок нет при отправке — просто в тексте письма вместо «Это текст по русски 8888888888888889999999999999999999999999999999» приходит «8888888888888889999999999999999999999999999999» — т.е. русские символы теряются… Поправлю код и посмотрю что получится. И с файлами проблема — не открываются из письма.

Всем удачи!!!

 

См. мои статьи:
https://gency.ru/send-letter
https://gency.ru/send-letter-with-attachment

Если письма отправляете не себе, кодировать текст письма нужно всегда (НЕ 8-bit’ом). А Subject и др. заголовки просто всегда, причем там тоже нужно делить на короткие строки особым образом.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *