Новая форма отправки данных на почту с сайта с решенной проблемой кодировки писем в Outlook / HTML и PHP

Автор Макс Пуля

Новая форма отправки данных на почту с сайта с решенной проблемой кодировки писем в Outlook / HTML и PHP Новая форма отправки данных на почту с сайта с решенной проблемой кодировки писем в Outlook / HTML и PHP

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

Предыдущая форма обратной связи, опубликованная на сайте Epic Blog была почти совершенна! Она рабочая и выполняет все свои функции. Но была, пожалуй, одна проблема… Когда письма приходили в почтовый клиент Outlook от Microsoft, вид у них был не читабельный, вот такой:

Проблема с кодировкой писем в Outlook, отправленных с сайта из формы отправки, Outlook определяет кодировку как KOI8-R вместо UTF-8

Дело в том, что Outlook не понимал, в какой кодировке приходит письмо и поэтому сам ему присваивал кодировку "Кириллица (KOI8-R)". И ничего не помогало исправить эту проблему в Аутлуке. Принудительная смена кодировки письма в UTF-8 или любую другую не давали никаких положительных результатов.

И эта проблема была только в Аутлуке. Другие остальные почтовые сервисы и почтовые клиенты принимают письмо в правильной кодировке. Но так как огромное количество людей на Земле используют в своей работе именно Outlook, то нужно было исправить эту проблему.

Долго, очень долго я шерстил Интернет, в поисках решения этой проблемы. Толком ничего не найдя, я решил настроить переадресацию писем с gmail на почту epicblog. Идея была в том, чтобы письма с формы обратной связи приходили сначала на gmail, а потом переадресовывались на почту Эпик блога. Переадресацию я настроил, но вот не задача… Это не помогло, всё равно кракозябры…

Затем я решил принудительно в коде PHP указать кодировку. Опять же, во всём Интернете я не нашел реального примера. Нашел только команду конвертации текста из одной кодировки в другую. Команда такая: iconv("windows-1251", "utf-8", $_POST['message']); Однако, такая команда не работала, так как текст уже был в кодировке utf-8. Оставалось проверить последнюю теорию. Если Outlook сам определяет кодировку как KOI8-R - нужно дать ему эту кодировку. Таким образом, пишем: iconv("utf-8", "KOI8-R", $_POST['message']); По волшебству, русский текст стал корректно отображаться в письме в Аутлуке. Но из этого следовала другая проблема. Корректно текст отображался только в Outlook! Другие почтовые клиенты стали сходить с ума. Очевидно, этот способ не подходил для решения задачи. И снова поиски…

Далее я нашел следующий код, который якобы решал проблему кодировки писем: 'Content-type: text/plain; charset=utf-8'. Но после его вставки, форма переставала работать вообще. Но спустя еще несколько часов поиска, различных вариантов написания, методом проб и ошибок - я добился решения проблемы!

Скачать готовое рабочее решение формы отправки писем на почту с сайта по этой прямой ссылке. НЕ ЗАБУДЬТЕ поменять ящики на свои!

Дополнительно напишу весь код сюда, чтобы было визуально понятно!

Код в файле SEND.php

<?php
/*
Форма обратной связи может получать сообщения с любых почтовых ящиков.
Исправлена проблема кодировки при получении писем почтовым клиентом Outlook.
Вы скачали её с сайта Epic Blog https://epicblog.net Заходите на сайт снова!
ВНИМАНИЕ! Лучше всего в переменную myemail прописать почту домена, который использует сайт. А не mail.ru, gmail и тд.
*/
if(isset($_POST['submit'])){
/* Устанавливаем e-mail Кому и от Кого будут приходить письма */
$to = "info(собака)epicblog.net"; // Здесь нужно написать e-mail, куда будут приходить письма
$from = "no-reply(собака)epicblog.net"; // Здесь нужно написать e-mail, от кого будут приходить письма, например no-reply(собака)epicblog.net

/* Указываем переменные, в которые будет записываться информация с формы */
$first_name = $_POST['first_name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$subject = "Форма отправки сообщений с сайта Epic Blog";

/* Проверка правильного написания e-mail адреса */
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email))
{
show_error("<br /> Е-mail адрес не существует");
}

/* Переменная, которая будет отправлена на почту со значениями, вводимых в поля */
$mail_to_myemail = "Здравствуйте!
Было отправлено сообщение с сайта!
Имя отправителя: $first_name
E-mail: $email
Номер телефона: $phone
Текст сообщения: $message
Чтобы ответить на письмо, создайте новое сообщение, скопируйте электронный адрес и вставьте в поле Кому.";

$headers = "From: $from \r\n";

/* Отправка сообщения, с помощью функции mail() */
mail($to, $subject, $mail_to_myemail, $headers . 'Content-type: text/plain; charset=utf-8');
echo "Сообщение отправлено. Спасибо Вам " . $first_name . ", мы скоро свяжемся с Вами.";
echo "<br /><br /><a href='https://epicblog.net'>Вернуться на сайт.</a>";
}
?>
<!--Переадресация на главную страницу сайта, через 3 секунды-->
<script language="JavaScript">
function changeurl(){eval(self.location="https://epicblog.net");}
window.setTimeout("changeurl();",3000);
</script>

Код в файле form.html

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<form action="send.php" method="post">
Ваше имя <input type="text" name="first_name"><br>
Email: <input type="text" name="email" required placeholder="Обязательное поле"><br>
Номер телефона: <input type="text" name="phone"><br>
Сообщение:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Отправить">
</form>
</html>

Форма рабочая на 100%! Проверена и перепроверена тысячу раз! Также проверенно, чтобы письма приходили на все почтовые ящики, а не только на почту домена. То есть, вы можете указать почту mail ru или gmail и письма будут отправляться туда. Хотя я всегда рекомендую использовать почту домена, на котором находится форма отправки писем с сайта.

Скачать готовое рабочее решение формы отправки писем на почту с сайта по этой прямой ссылке. НЕ ЗАБУДЬТЕ поменять ящики на свои!

Меняйте ящики на свои обязательно! Думаю, есть такие, кто не меняет адрес электронной почты на свой, куда будут отправляться сообщения. Затем отправляют пробное письмо, а оно не приходит и думают, что форма не рабочая. Так вот, мне часто приходят такие тестовые сообщения! Меняйте ящики!!!

Всем удачи и добра!

Макс Пуля

Макс Пуля

Приветствую! Присоединяйтесь к сообществу Epic Blog и выражайте свои мысли.

20 комментарии

  • Дмитрий написал Дмитрий

    Огромное спасибо за форму!!! Но есть вопрос. если ввести в поле e-mail неправильный формат адреса, то возникает ошибка Fatal error: Uncaught Error: Call to undefined function show_error()

  • Виталий написал Виталий

    Здравствуйте.
    Ваш код отлично работает, но после редактирования под свою форму - не хочет.

    Я понимаю, что где-то напорол в синтаксисе.

    Если согласитесь глянуть мой код, скажите, куда его выложить.

  • Константин написал Константин

    помоги пожалуйста есть форма













    Ваша сообщение отправлено…
    Не удалось обработать, попробуйте позже…



    ииии есть php обработчик

    ?php
    // EDIT THE 2 LINES BELOW AS REQUIRED
    $sendemail_to = "79хххххх@yandex.ru";
    $email_subject = "Your email subject line";

    //GET FIELDS FROM YOUR HTML FORM, THE NAME PROPERTY IS PASSED IN THE $_POST ARRAY
    //E.G IF YOU HAVE A FIELD WITH name="email" YOU'LL GET THE VALUE IN PHP SCRIPT
    //LIKE BELOW
    $email = $_POST['email'];
    $message = $_POST['message'];
    $name = $_POST['name'];
    $phone = $_POST['phone'];

    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
    $headers .= "From: ".$email. "\r\n";

    /*Customize your message here*/
    $message = "Email = ".$email."";
    $message .= "Name = ".$name."";

    if(!empty($phone))
    $message .= "Phone = ".$phone."";

    $message .= "Message = Formify Sample Message!";

    @mail($send_email_to, $email_subject, $message,$headers);

    header('Content-type: text/json');
    $return_array['success'] = '1';
    echo json_encode($return_array);
    die();
    ?>

    при этом на почту приходит только это:

    Email = 797хххх@yandex.ru
    Name = Консхххх
    Message = Formify Sample Message! при вводе любого текста в поле сообщение приходит постоянно Message = Formify Sample Message! помогите плиз!

  • Олег написал Олег

    и еще вопрос на миллион как вместо сообщения сделать выпадающий список с выбором из указанных мною вариантов?

  • Олег написал Олег

    У вас КОД В ФАЙЛЕ MAIL.PHP а в HTML я так понимаю тут нужно вместо "send.php" нужно написать MAIL.PHP или это мой тупизм )?

  • Дмитрий написал Дмитрий

    Заполните форму и наш менеджер свяжется с вами в ближайшее время




    заказать звонок


    скажите что у меня не так. 3 дня туплю уже. кнопка отправить не работает

  • Максим написал Максим

    Привет! А можно к ней приклеить отправку файла?

  • Макс Пуля написал Макс Пуля

    Здравствуйте, Василий. Да, вы правы! Улучшениям нет предела)) В этом вся суть: берешь этот РАБОЧИЙ код и улучшаешь его, как нужно именно вам!

  • Василий написал Василий

    Здравствуйте. Прошу обратить внимание на строку 7 кода HTML. Email: майла на сайте даже не "майлообразного" текста, сообщение отправляется с этим текстом вместо email. Но если (input type="email"…), то браузер заставляет писать email. Хотя человек сможет ввести ложный адрес, но это уже о другая тема. Спасибо.

  • Халит написал Халит

    Всем привет! Форма работает, но на почту ничего не приходит. Емеил ввёл свой.