Задать вопрос

Как изменить кодировку в PHP?

Привет! На сайтике есть контактная форма, содержащая код
<?php

/**
 * Класс отправки почтовых сообщений функций mail()
 */
class Mail {
    //В переменной храним тип сообщения, обычный текст, или html
    private $_plain = "text/plain";  

    /**
     * Метод установки типа сообщения, если параметр $type = true, сообщение будет HTML,
     * если false, то обычный текст
     * @param <boolean> $type
     */

    public function isTypeHtml($is_html = true) {
        if ($is_html == true) {
            $this->_plain = "text/html";
        } else {
            $this->_plain = "text/plain";
        }
    }

    /**
     * Метод отправляет сообщение
     * @param string $to - e-mail, на который придет сообщение
     * @param <type> $to_name - Имя получателя
     * @param string $from - e-mail, с которого будет отправлено сообщение
     * @param <type> $from_name - Имя отправителя
     * @param string $subject - тема сообщения
     * @param <type> $message - сообщение
     * @return <type>
     */
    public function send($to, $to_name, $from, $from_name, $subject, $message) {
        //Делаем правильные заголовки, чтобы русский был русским, и т.д.
        $headers = "From: =?windows-1251?B?" . base64_encode($from_name) . "?= <$from>\r\n"; 
        $headers .= "To: =?windows-1251?B?" . base64_encode($to_name) . "?= <$to>\r\n";
        $headers .= "Subject: =?windows-1251?b?" . base64_encode($subject) . "?=\r\n";
        $headers .= "Content-type: $this->_plain; charset=\"windows-1251\"\r\n";
        $headers .= "Testapp\r\n";
   
        //Если сообщение отправлено, то возвращаем true
        if (mail($to, $subject, $message, $headers)) { 
            return true;
        }
        else return false; //Если возникли ошибки при отправке сообщений, то false

    }

}

if (isset($_POST["send"])) {
    $mail = new Mail(); //Создаем класс Mail
    $mail->isTypeHtml(false); //Ставим тип сообщения как обычный текст
    $message = "ФИО: " . $_POST["fio"] . "\n\r"; //Готовим само сообщение
    $message .= "email: " . $_POST["email"] . "\n\r";
    $message .= "Сообщение: " . $_POST["message"] . "\n\r";

    //Отправляем сообщение
    if ($mail->send("spam@tst.ru", "tstapp.ru", "mymail@gmail.de", "Остроумное название компании",
                "Сообщение с сайта tstapp.ru ", $message)) {
        echo "<h3>Сообшение успешно отправлено! Мы свяжемся с вами как можно скорее</h3>";
    } else {
        echo "<p>Возникли ошибки при отправке сообщения! Если у вас не получается отправить письмо, напишите его по адресу blabla@tst.ru</p>";
    }
}
?>
     
     <h5 id="contact">ОБРАТНАЯ СВЯЗЬ</h5>
<form method="post" action="">
    <table cellpadding="2" cellspacing="0" border="0">
        <tbody>
            <tr>
                <td valign="middle" align="right"></td>
                
                    <input type="text" placeholder="Ваше имя" name="fio" size="25" maxlength="25" />
                </td>
            </tr>
            <tr>
                <td valign="middle" align="right"></td>
                
                    <input type="text" placeholder="Ваша электропочта" name="email" size="25" maxlength="35" /><br/>
                </td>
            </tr>
            <tr>
                <td valign="top" align="right"></td>
                
                    <textarea name="message" placeholder="Сообщение" rows="10" cols="50"> </textarea>
                </td>
            </tr>
            <tr>
                <td valign="middle" align="right" colspan="2">
                    <button  name ="send" type="submit">Отправить</button>
                </td>
            </tr>
        </tbody>
    </table>
</form>
<!--FORM END-->

Дело в том,что сообщения приходят наполовину по-русски. То есть заголовок выглядит так:<<Сообщение с сайта Сообщение СЃ сайта>>
Также хочется чтобы адресат был не <<Сообщение СЃ сайта>>, а <<Остроумное название компании>>, то бишь по-русски.
Что мне убрать или добавить в коде,чтобы не было так страшно?
  • Вопрос задан
  • 2770 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
@0x3 Автор вопроса
В общем решение пришло само,но не без вашей помощи.
Убрал лишнее
//Делаем правильные заголовки, чтобы русский был русским, и т.д.
        $headers = "From: =?windows-1251?B?" . base64_encode($from_name) . "?= <$from>\r\n"; 
        $headers .= "To: =?windows-1251?B?" . base64_encode($to_name) . "?= <$to>\r\n";
        $headers .= "Subject: =?windows-1251?b?" . base64_encode($subject) . "?=\r\n";
        $headers .= "Content-type: $this->_plain; charset=\"windows-1251\"\r\n";
        $headers .= "Testapp\r\n";

И все заработало
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Misha7
header("Content-Type: text/html; charset=windows-1251");
Ответ написан
EminH
@EminH
PHP без разницы какая кодировка, у вас сайт в какой кодировке?
Похоже что сайт сам в UTF а почта отсылается в 1251 ($headers = "From: =?windows-1251?B?")
Ответ написан
Комментировать
shcherbanich
@shcherbanich
Программист
Используйте готовые решения и классы, зачем придумывать велосипеды
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект