Headers content type text html charset windows 1251 r n

Стандартная функция отправки почты в PHP не заботится о кодировке письма, а специальные классы отправки писем могут показаться слишком тяжеловесным решением. В настоящей статье приведена простая функция, которая позволяет отправлять MIME-совместимые письма на русском языке в виде простого текста или в формате HTML.

Стандартная функция отправки почты в PHP не заботится о кодировке письма, а специальные классы отправки писем могут показаться слишком тяжеловесным решением. В настоящей статье приведена простая функция, которая позволяет отправлять MIME-совместимые письма на русском языке в виде простого текста или в формате HTML.

Тело письма может быть текстом в любой кодировке. Немного сложнее дело обстоит с составляющими заголовка письма (Subject, From, To), они по стандарту должны быть в US-ASCII. Использование в заголовках кодированного текста регламентируется стандартом RFC-2047. Стандарт задает две возможные формы кодирования — BASE64 и Quoted-Printable. BASE64 более универсальна и работает в том числе для кодировки UTF-8, поэтому мы выбрали именно эту форму. MIME-совместимый почтовый клиент обязан уметь читать обе формы.

Далее код функции, который достаточно схематичен:

<?php

function send_mime_mail($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $name_to, // имя получателя
                        $email_to, // email получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body, // текст письма
                        $html = FALSE, // письмо в виде html или обычного текста
                        $reply_to = FALSE
                        ) {
  $to = mime_header_encode($name_to, $data_charset, $send_charset)
                 . ‘ <‘ . $email_to . ‘>’;
  $subject = mime_header_encode($subject, $data_charset, $send_charset);
  $from =  mime_header_encode($name_from, $data_charset, $send_charset)
                     .‘ <‘ . $email_from . ‘>’;
  if($data_charset != $send_charset) {
    $body = iconv($data_charset, $send_charset, $body);
  }
  $headers = «From: $fromrn«;
  $type = ($html) ? ‘html’ : ‘plain’;
  $headers .= «Content-type: text/$type; charset=$send_charsetrn«;
  $headers .= «Mime-Version: 1.0rn«;
  if ($reply_to) {
      $headers .= «Reply-To: $reply_to»;
  }
  return mail($to, $subject, $body, $headers);
}

function mime_header_encode($str, $data_charset, $send_charset) {
  if($data_charset != $send_charset) {
    $str = iconv($data_charset, $send_charset, $str);
  }
  return ‘=?’ . $send_charset . ‘?B?’ . base64_encode($str) . ‘?=’;
}

?>

Мы определили собственную функцию mime_header_encode() для преобразования каждого заголовка в MIME-совместимый формат, несмотря на то, что в PHP предусмотрена аналогичная функция mb_encode_mimeheader(). От встроенной функции нам пришлось отказаться, так как на нашем сервере (PHP 5.1.6) она работает некорректно (возвращает неверный результат).

Использование описанной функции достаточно простое, см. пример ниже. В случае, если кодировка отправки письма отличается от текущей кодировки данных, используется iconv() для преобразования кодировки.

<?php
send_mime_mail(‘Автор письма’,
               ‘sender@site.ru’,
               ‘Получатель письма’,
               ‘recepient@site.ru’,
               ‘CP1251’,  // кодировка, в которой находятся передаваемые строки
               ‘KOI8-R’, // кодировка, в которой будет отправлено письмо
               ‘Письмо-уведомление’,
               «Здравствуйте, я Ваша программа!»);

?>

© Все права на данную статью принадлежат порталу webew.ru.
Перепечатка в интернет-изданиях разрешается только с указанием автора
и прямой ссылки на оригинальную статью. Перепечатка в печатных
изданиях допускается только с разрешения редакции.

Делаю форму отправки письма на почту с сайта. Как сделать и что прописать в функции, чтобы письма приходили на почту в виде html?

Кроме того, даже простой текст приходит в письме на абракадабре , это на mail.ru почте, а на yandex.ru всё нормально.

Как решить вопрос?

Код такой:

if(!isset($hasError)) {
    $emailTo = 'mail@mail.ru'; //Сюда введите Ваш email
    $body = "Вам поступил заказ с сайта Вектор-М на: nПакет $vid_pack $color_view nnПараметры: nnШирина:$width мм nnДлина:$length мм nnТолщина:$thickness мкм nnКоличеством: $quantity шт.nпо цене $price руб/шт. на общую сумму $summa руб. nnКонтактные данные: nnИмя:$contactname nnТелефон:$phone nnE-mail:$email nnПримечание:n$messagen
";
    $headers = 'From: Форма заказа с сайта Вектор-М <'.$emailTo.'>' . "rn" . 'Reply-To: ' . $email;

    mail($emailTo, $subject, $body, $headers);
    $emailSent = true;
} else {
    exit ("<p>Вы заполнили не все обязательные поля, вернитесь назад и заполните все обязательные поля.<br><input name='back' type='button' value='Вернуться назад' onclick='javascript:self.back();'></p>");
    }
}

AntonioK's user avatar

AntonioK

3,17919 серебряных знаков42 бронзовых знака

задан 31 авг 2011 в 12:06

cheh1's user avatar

1

Попробуйте так:

$to = 'user@example.com';
$subject = 'Заголовок';
$message = '
<html>
<head>
  <title>Заголовок</title>
</head>
<body>
  <p>Привет!</p>
</body>
</html>
';

$headers  = 'MIME-Version: 1.0' . "rn";
$headers .= 'Content-type: text/html; charset=windows-1251' . "rn";
$headers .= 'From: Reminder <Reminder@example.com>' . "rn";

mail($to, $subject, $message, $headers);

AntonioK's user avatar

AntonioK

3,17919 серебряных знаков42 бронзовых знака

ответ дан 31 авг 2011 в 12:23

Damon's user avatar

DamonDamon

9765 серебряных знаков16 бронзовых знаков

1

В заголовке письма нужно указать, что это именно text/html , по умолчанию шлется как обычный текст. А то, что абра-кадабра, так тоже — в заголовке письма нужно явно указать кодировку. Погуглите на тему mime headers.

Nicolas Chabanovsky's user avatar

ответ дан 31 авг 2011 в 12:11

DemoS's user avatar

DemoSDemoS

3,94118 серебряных знаков41 бронзовый знак

<form method="post" action="formmail.php" enctype="application/x-www-form-urlendoded">

enctype определяет формат отправляемых данных при использовании метода передачи данных post. По умолчанию используется application/x-www-form-urlendoded

ответ дан 31 авг 2011 в 19:09

Monstrs-Inc's user avatar

Monstrs-IncMonstrs-Inc

2321 золотой знак4 серебряных знака14 бронзовых знаков

Отправка писем через SMTP с авторизацией на phpВ этой статье я хочу показать как можно сделать отправку писем из php через smtp сервер на примере smtp.yandex.ru
Иногда бывает такое, что на хостинге запрещено отсылать письма стандартными средствами — mail(), такое в основном бывает на бесплатных хостингах :) Так же бывает необходимость слать почту через smtp и на серверах, по ряду различных причин.

Приступим к реализации, для выполнения отправки через smtp потребуется возможность работы php с сокетами. Код получился большой и для удобства я его оформил в отдельный класс, который можно скачать тут.

Ниже пример использования класса:

// пример использования
require_once "SendMailSmtpClass.php"; // подключаем класс

$mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'smtp.yandex.ru', 'Evgeniy'); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass('логин', 'пароль', 'хост', 'имя отправителя');

// заголовок письма
$headers= "MIME-Version: 1.0rn";
$headers .= "Content-type: text/html; charset=utf-8rn"; // кодировка письма
$headers .= "From: Evgeniy <admin@vk-book.ru>rn"; // от кого письмо
$result =  $mailSMTP->send('zhenikipatov@yandex.ru', 'Тема письма', 'Текст письма', $headers); // отправляем письмо
// $result =  $mailSMTP->send('Кому письмо', 'Тема письма', 'Текст письма', 'Заголовки письма');
if($result === true){
    echo "Письмо успешно отправлено";
}else{
    echo "Письмо не отправлено. Ошибка: " . $result;
}

Обновление 30.09.2014
В последнее время Яндекс не работает через простой сокет, только через SSL, поэтому следует использовать вот такой код для вызова класса:

$mailSMTP = new SendMailSmtpClass('zhenikipatov@yandex.ru', '****', 'ssl://smtp.yandex.ru', 'Evgeniy', 465);

Обновление 1.10.2014
Обновлен класс. Теперь корректно происходит работа с почтовым сервером mail.ru по SSL протоколу.
Так же для корректной работы с mail.ru необходимо в заголовках письма в отправителе указывать e-mail, с которого происходит отправка, например:
Если авторизация происходит через e-mail ipatovsoft@mail.ru, то заголовок должен выглядеть следующим образом:

$headers .= "From: Evgeniy <ipatovsoft@mail.ru>rn"; // от кого письмо

Обновление 2.10.2014
Класс подредактирован, теперь работает и с gmail.com через протокол SSL
Пример:

$mailSMTP = new SendMailSmtpClass('ipatovsoft@gmail.com', '*****', 'ssl://smtp.gmail.com', 'Evgeniy', 465);

Так же вы можете почитать об обновленном классе и работе через протокол ssl в новой статье: Отправка писем через SMTP с авторизацией по протоколу SSL на php.

Обновление 13.03.2018: Класс обновился, подробнее тут: Новая версия класса SendMailSmtpClass

  • Как отправлять письма, используя PHP?
  • Как отправлять письма, используя ASP.NET?
  • Как отправлять письма, используя ASP?
  • WordPress
  • Joomla
  • Drupal
  • NetCat

Поскольку отправка анонимных сообщений с серверов виртуального Windows-хостинга запрещена, отправку писем следует производить через SMTP-сервер, для чего так же возможно использовать и нашу почтовую систему.

Как отправлять письма, используя PHP?

С помощью любого класса PHP, поддерживающего авторизацию на smtp-сервере. Например, можно использовать набор классов PHPMailer.

Также вы можете воспользоваться нашим примером, в котором реализована отправка писем с использованием smtp-сервера, для которого требуется авторизация. Поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

<?php

// Если нужно показать лог SMTP-сессии, то можно раскомментировать следующую строчку.
// $_SERVER['debug'] = true;

function MailSmtp($reciever$subject$content$headers$debug 0) {

  $smtp_server 'smtp.masterhost.ru'// адрес SMTP-сервера
  $smtp_port 25// порт SMTP-сервера
  $smtp_user 'user@domen.ru'// Имя пользователя для авторизации на SMTP-сервере
  $smtp_password 'pAsSwORd'// Пароль для авторизации на SMTP-сервере
  $mail_from 'frommailbox@domen.ru'// Ящик, с которого отправляется письмо

  $sock fsockopen($smtp_server,$smtp_port,$errno,$errstr,30);

  $str fgets($sock,512);
  if (!$sock) {
    printf("Socket is not createdn");
    exit(1);
  }

  smtp_msg($sock"HELO " $_SERVER['SERVER_NAME']);
  smtp_msg($sock"AUTH LOGIN");
  smtp_msg($sockbase64_encode($smtp_user));
  smtp_msg($sockbase64_encode($smtp_password));
  smtp_msg($sock"MAIL FROM: <" $mail_from ">");
  smtp_msg($sock"RCPT TO: <" $reciever ">");
  smtp_msg($sock"DATA");

  $headers "Subject: " $subject "rn" $headers;

  $data $headers "rnrn" $content "rn.";

  smtp_msg($sock$data);
  smtp_msg($sock"QUIT");

  fclose($sock);
}


function smtp_msg($sock$msg) {

  if (!$sock) {
    printf("Broken socket!n");
    exit(1);
  }

  if (isset($_SERVER['debug']) && $_SERVER['debug']) {
    printf("Send from us: %s<BR>"nl2br(htmlspecialchars($msg)));
  }
  fputs($sock"$msgrn");
  $str fgets($sock512);
  if (!$sock) {
    printf("Socket is downn");
    exit(1);
  }
  else {
    if (isset($_SERVER['debug']) && $_SERVER['debug']) {
      printf("Got from server: %s<BR>"nl2br(htmlspecialchars($str)));
    }

    $e explode(" "$str);
    $code array_shift($e);
    $str implode(" "$e);

    if ($code 499) {
      printf("Problems with SMTP conversation.<BR><BR>Code %d.<BR>Message %s<BR>"$code$str);
      exit(1);
    }
  }
}

?>

Скачать пример готового скрипта с функцией MailSmtp(): smtpauth.php.sample

Использовать описанную выше функцию MailSmtp() можно для прямой замены функции mail(), рассмотрим пример самой простой формы на PHP:

<?php

if (isset($_POST['submit'])) {

  $to      $_POST['to'];
  $subject $_POST['subj'];
  $message $_POST['msg'];
  
  // Заголовки сообщения, в них определяется кодировка сообщения, поля From, To и т.д.
  $headers "MIME-Version: 1.0rn";
  $headers .= "Content-type: text/html; charset=windows-1251rn";
  $headers .= "To: $torn";
  $headers .= "From: Имя отправителя <from@domen.ru>";
  
  // mail ($to, $subject, $message, $headers);
 
  require_once "smtpauth.php";
  MailSmtp ($to$subject$message$headers);

} 

?>

<form action="" method="post">
  <pre>
    Кому:   <input type="text" name="to">
    Тема:   <input type="text" name="subj">
    Текст:  <input type="text" name="msg">
    <input type="submit" value="Отправить!" name="submit">
  </pre>
</form>

Для того, чтобы данная форма заработала без функции mail(), мы включили файл smtpauth.php через require_once и вызвали функцию MailSmtp(), описанную в нем, с аналогичными для mail() аргументами. При этом сам вызов mail() мы закомментировали в коде, чтобы избежать ошибки при выполнении скрипта.

Как отправлять письма, используя ASP.NET?

Если вы используете версию 2.0, то используя
класс MailMessage (используется пространство имен System.Net.Mail), хорошо описанный здесь.

Ниже приведены примеры его использования для языков «C#» и «VisualBasic»:

Пример для языка «C#»:

<% @Page Language="c#" %>
<% @Import Namespace="System.Net.Mail" %>
<% @Import Namespace="System.Net" %>
<%

MailMessage message = new MailMessage(); // создание нового письма
message.To.Add ("user@tomail.tld"); // добавление адреса получателя
message.From = new MailAddress("from@domain.tld", "Имя_отправителя"); // указание имени и адреса отправителя
message.Subject = "Тема письма"; // указание темы письма 
message.BodyEncoding = System.Text.Encoding.UTF8; // указание кодировки письма
message.IsBodyHtml = false; // указание формата письма (true - HTML, false - не HTML)
message.Body = "Текст письма"; // указание текста (тела) письма

SmtpClient client = new SmtpClient("smtp.masterhost.ru",25); // создание нового подключения к серверу "smtp.masterhost.ru"
client.DeliveryMethod = SmtpDeliveryMethod.Network; // определяет метод отправки сообщений
client.EnableSsl = false; // отключает необходимость использования защищенного соединения с сервером
client.UseDefaultCredentials = false; // отключение использования реквизитов авторизации "по-умолчанию"
client.Credentials = new NetworkCredential("postmaster@domain.tld", "***password***"); // указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере
client.Send(message); // отправка сообщения

%>

Скачать пример готовой формы, демонстрирующей использование данного метода: MailForm.aspx.

Пример для языка «VisualBasic»:

<% @Page Language="VB" Debug="true"  %>
<% @Import Namespace="System.Net.Mail" %>
<% @Import Namespace="System.Net" %>
<%

    Dim smtpMssg AS new MailMessage ' объявление нового объекта типа "MailMessage"
    smtpMssg.From = New MailAddress ("admin@domain.tld", "Имя_отправителя") ' указание имени и адреса отправителя
    smtpMssg.To.Add ("user@tomail.tld") ' добавление адреса получателя
    smtpMssg.Subject = "Тема письма" ' указание темы письма
    smtpMssg.Body = "Текст письма" ' указание текста (тела) письма
    smtpMssg.BodyEncoding = System.Text.Encoding.UTF8 ' указание кодировки письма
    smtpMssg.IsBodyHtml = false  ' указание формата письма (true - HTML, false - не HTML)
    
    Dim SmtpMail As New SmtpClient("smtp.masterhost.ru", 25)' объявление нового объекта типа "SmtpClient" 
    SmtpMail.DeliveryMethod = SmtpDeliveryMethod.Network ' указание метода доставки письма
    SmtpMail.UseDefaultCredentials = False ' отключение использования реквизитов авторизации "по-умолчанию" 
    SmtpMail.EnableSsl = False ' отключает необходимость использования защищенного соединения с сервером
    SmtpMail.Credentials = new NetworkCredential("postmaster@domain.tld", "***password***") ' указание нужных реквизитов (имени пользователя и пароля) для авторизации на SMTP-сервере
    SmtpMail.Send(smtpMssg) ' отправка сообщения

%>

Также существует устаревший (и не рекомендуется к использованию) класс SmtpMail (используется пространство имен System.Web.Mail). Ниже приведен пример его использования для языка «VisualBasic»:

<% @Page Language="VB" Debug="true"  %>
<% @Import Namespace="System.Web" %>
<% @Import Namespace="System.Web.Mail" %>
<%

Dim smtpMssg = new MailMessage ' объявление нового объекта типа "MailMessage"

smtpMssg.From = "Имя_отправителя <admin@domain.tld>" ' указание имени и адреса отправителя
smtpMssg.To = "admin@domain.tld' указание адреса получателя
smtpMssg.BodyFormat = MailFormat.Text ' указание формата письма
smtpMssg.BodyEncoding = Encoding.UTF8 'указание кодировки письма
smtpMssg.Subject = "Тема письма" ' указание темы письма
smtpMssg.Body = "Текст письма" ' указание текста письма
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",1) ' указание необходимости SMTP-авторизации на сервере
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "admin@domain.tld") ' имя пользователя для авторизации
smtpMssg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "***password***") ' пароль для авторизации
SmtpMail.SmtpServer = "smtp.masterhost.ru" ' указание адреса SMTP-сервера
SmtpMail.Send(smtpMssg) ' отправка сообщения

%>

Как отправлять письма, используя ASP?

С помощью Collaboration Data Objects.

Обратите внимание, что при использовании нашего smtp-сервера требуется авторизация, поэтому не забудьте добавить в скрипт соответствующие реквизиты доступа, например:

<%
  iConfig = Server.CreateObject("CDO.Configuration")
  Set iConfig = Server.CreateObject("CDO.Configuration")
  With iConfig.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.masterhost.ru"
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = "ru"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "postmaster@domain.tld"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
    .Update
  End With

  Set cdoMessage = CreateObject("CDO.Message")

  With cdoMessage
      Set .Configuration = iConfig
      .From = "Test user <postmaster@domain.tld>"
      .To = "User <user@somedomain.com>"
      .Subject = "Hello, User"
      .TextBody = "I write this message from ASP script."
      .Send
  End With

Set cdoMessage = Nothing
Set iConfig = Nothing
%>

Некоторые CMS уже имеют встроенные средства для отправки корреспонденции или соответствующие модули, рассмотрим самые популярные из них.

WordPress

Для данной CMS существует специальный модуль «WP Mail SMTP», пример его конфигурации описан на странице модуля.

Обратите внимание на иллюстрацию в примере, в условиях нашей почтовой системы требуется использовать 25-й порт и SSL-шифрование не требуется.

Joomla

В панели администрирования перейдите в раздел «Общие настройки», выберете вкладку «Сервер». В поле «Почта» требуется выбрать способ отправки как «SMTP-сервер», в полях «Адрес SMTP-сервера» и «SMTP-логин» и «SMTP-пароль» укажите соответствующие реквизиты почтовой системы, например: smtp.masterhost.ru, ящик@ваш_домен и соответствующий пароль.

Подробнее вы можете прочитать в документации к данной CMS.

Drupal

Эта CMS так же имеет собственный модуль для работы с SMTP-сервером, основанный на базе PHPMailer. Загрузить данный модуль можно на его странице на сайте CMS Drupal, описание установки модуля доступно в архиве с ним.

NetCat

Данная CMS не имеет встроенных функций для работы с SMTP-сервером. Для отправки почты скриптами сайта мы можем предложить использовать наше решение, для его подключения необходимо выполнить следующие действия:

  • Скачать с нашего сайта архив с необходимыми файлами (send_auth_mail.php и mail.inc.php) и распаковать его на компьютере;
  • Отредактировать файл send_auth_mail.php из архива, указав в нём реквизиты подключения к нужному SMTP-серверу:

    • $mail_smtpServer = «smtp.masterhost.ru»; (адрес SMTP-сервера)
    • $mail_port = «25»; (порт для подключения)
    • $mail_username = «mail@domain.tld»; (имя пользователя для авторизации на SMTP-сервере)
    • $mail_password = «Password»; (пароль для авторизации на SMTP-сервере)
  • Создать резервную копию файла domain.tld/www/netcat/admin/mail.inc.php;
  • Загрузить файлы send_auth_mail.php и mail.inc.php на виртуальную площадку в директорию domain.tld/www/netcat/admin/

domain.tld следует заменить на имя вашего домена.

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

кодировка сайта

От автора: вопрос кодировок является, без сомнения, одним из актуальных вопросов рано или поздно встающим перед любым веб-мастером. Практически каждый из нас сталкивался с такой, порой довольно неприятной, проблемой, как проблема корректного отображения информации на сайте, т.е. вывод ее на экран в нужной нам кодировке. Несмотря на то, что этот вопрос почти всегда решается очень легко, и ничего сложного в нем нет. Сейчас в сети можно часто увидеть вопросы о всевозможных «кракозябрах, вопросах и ромбиках» на сайте.

1. Кодировка при работе без использования баз данных

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

Кодировка в Вашем проекте должна быть универсальной.

Какое значение вкладывается в этот термин — «универсальная»? Это значит, что все составляющие создаваемого проекта, которые так или иначе касаются кодировок, должны иметь единую кодировку. Чтобы понять эту мысль разобьем сформулированный тезис на пункты, которые затем поэтапно разберем:

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

    1. Содержимое всех файлов должно иметь единую кодировку.

    2. Заголовки должны передавать единую кодировку.

    3. В качестве кодировки сервера необходимо установить единую кодировку.

    4. Кодировка соединения с БД также не должна отличаться от кодировки создаваемого проекта.

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

Итак, на сервере создадим файл index.php, содержимое которого сохраним в кириллической кодировке. Сделать это можно, например, в редакторе Notepad++ через пункт меню Кодировки.

кодировка сайта

Узнать текущую кодировку файла можно взглянув в строку состояния редактора (в нижней панели).

кодировка сайта

Здесь уместно дать небольшой совет. При создании сайтов лучше пользоваться одной из двух кодировок: кириллической (windows-1251) или юникод без сигнатуры BOM (utf-8 without BOM). При этом следует знать, что юникод более универсален. Эта кодировка содержит большее количество символов, а потому идеально подойдет для мультиязычных сайтов, в то время как с кириллической кодировкой здесь могут возникнуть проблемы. Есть еще ряд нюансов при использовании юникода. В общем, лучше использовать ту кодировку, которая более универсальна, но если Ваш сайт содержит только кириллические символы, то никто не запрещает использовать Вам windows-1251, тем более, что она также имеет свои плюсы (детальнее об этом, возможно, в одном из следующих уроков).

Отлично, кодировка нашего файла кириллическая (windows-1251). У всех остальных файлов проекта, согласно первому пункту, кодировка должна быть аналогичной. В мета-тегах (между тегами head) также укажем эту кодировку:

<meta httpequiv=«content-type» content=«text/html; charset=windows-1251» />

Выведем какой-нибудь текст кириллицей на страницу:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»

    «//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>

<html xmlns=«//www.w3.org/1999/xhtml»>

<head>

<meta httpequiv=«content-type» content=«text/html; charset=windows-1251» />

<meta name=«keywords» content=«» />

<meta name=«description» content=«» />

<title>Кодировки</title>

<link href=«» rel=«stylesheet» type=«text/css» />

</head>

<body>

<p>Тестовая строка</p>

</body>

</html>

Сохраним файл и попробуем открыть его в браузере… На экран выводится нечитабельная строка — набор вопросительных знаков вместо букв.

кодировка сайта

Почему так? Ведь мы сохранили файл в кириллической кодировке, в мета-теге также прописали нужную кодировку, но это не помогло. Если мы взглянем, в какой именно кодировке браузер отобразил нам текст, то увидим UTF-8.

кодировка сайта

При этом если мы выставим в браузере вручную нужную нам кодировку, то текст станет читабельным, но… до следующего обновления страницы в браузере. Еще раз зададимся вопросом, почему так произошло? Почему браузер никак не отреагировал на кодировку указанную в мета-теге?

«Виноват» здесь не браузер, а сервер. Дело в том, что сервер отсылает в браузер так называемые заголовки, где указывается кодировка, в которой браузер должен отобразить содержимое файла. В качестве кодировки сервер берет кодировку по умолчанию, т.е. так называемую дефолтную кодировку сервера. Посмотреть дефолтную кодировку сервера можно в конфигурационном файле httpd.conf, расположенном на сервере в каталоге usrlocalapacheconf. Здесь кодировка задается в строке AddDefaultCharset. Здесь же мы можем изменить кодировку на нужную нам, при этом не забывая после внесения изменений перезапускать сервер.

Но изменить кодировку получится только на локальном сервере. На сервере в сети хостер нам просто не даст доступ к конфигурационному файлу сервера… и правильно сделает 🙂 Что же нам делать в таком случае? Неужели придется подстраиваться под настройки сервера? Конечно же нет. Для решения этой задачи существует 2 варианта, отвечающих за второй и третий сформулированные нами выше пункты.

Согласно второму пункту мы можем самостоятельно передать в заголовках необходимую кодировку. Делается это при помощи функции header(), в параметрах которой мы укажем тип документа и, собственно, кодировку. В самом верху файла (перед объявлением доктайпа (типа документа)) добавим строку кода:

<?php header(«Content-type: text/html; Charset=windows-1251»); ?>

Если теперь обновить страницу в браузере, то увидим читабельный текст в кириллической кодировке. Замечательно — мы решили задачу! Путем передачи заголовков мы указали нужную нам кодировку. Но этот вариант не совсем универсален. Дело в том, что заголовки передаются посредством функции header(), т.е. для этого мы используем средства PHP. Но что же тогда делать, если файлы нашего проекта имеют расширение html? В файлах с таким расширением по умолчанию код PHP не выполняется, соответственно — заголовки не будут отправлены. Результат — вновь нечитабельный текст в браузере.

Альтернативой является второе решение (пункт 3), которое гораздо более универсальнее первого. Итак, согласно пункта 3 мы должны установить дефолтной кодировкой сервера нужную нам. Но как это можно сделать, если к конфигурационному файлу сервера мы доступа не имеем? Очень просто. Предусмотрен специальный файл, в котором можно изменять некоторые настройки сервера, в частности — дефолтную кодировку. Файл этот не имеет расширения и называется .htaccess (с точкой в начале имени файла). В самом файле достаточно прописать ту же строку, что и в конфигурационном файле сервера, но с указанием необходимой кодировки:

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

AddDefaultCharset windows1251

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

Теперь файлы открываются в «правильной» (нужной нам) кодировке (функцию header() теперь нет надобности использовать) и кодировка нашего проекта не будет зависеть от настроек сервера того или иного хостера.
Но помните, если мы нарушим сформулированный нами тезис об универсальности кодировки и, к примеру, при установленной в качестве дефолтной кодировки кириллице перекодируем содержимое файлов в юникод, то получим знаменитые «кракозябры».

кодировка сайта

2. Проблема кодировки при работе с базой данных

Теперь взглянем на ту же проблему, но с использованием в работе БД. Дело в том, что в таблицах БД лежит текст, и эти таблицы также могут иметь свою кодировку. Поскольку я использую в качестве сервера Денвер, который настроен под кириллическую кодировку, то логично, что для хранения информации в БД по умолчанию используется также кириллическая кодировка.

Не будем ничего изменять в настройках и при создании БД и таблицы оставим все как есть, т.е. будет использована кириллическая кодировка. Хотя, забегая вперед, можно сказать, что если бы мы создали таблицы в нужной нам кодировке, то это совсем не означает, что данные будут выведены в этой же кодировке… вся хитрость в том, что здесь существует такой параметр, как кодировка соединения с БД. Вот ее то мы и будем использовать для достижения нужного результата.

Итак, создадим файл с кодировкой юникод (поскольку мы заранее знаем, что данные из БД будут выведены в кириллической кодировке), т.е. мы таким образом поставили перед собой в учебных целях проблему, которую и попытаемся решить… как говорится, тяжело в учении… 🙂

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?php header(«Content-type: text/html; Charset=utf-8»); ?>

<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»

    «//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>

<html xmlns=«//www.w3.org/1999/xhtml»>

<head>

<meta httpequiv=«content-type» content=«text/html; charset=utf-8» />

<meta name=«keywords» content=«» />

<meta name=«description» content=«» />

<title>Кодировка при работе с БД</title>

<link href=«» rel=«stylesheet» type=«text/css» />

</head>

<body>

</body>

</html>

Теперь создадим БД charset и в ней таблицу test с двумя полями:

id, тип INT, первичный ключ, автоинкремент;

text, тип VARCHAR, длина 255.

В таблицу поместим единственную запись в поле text:

Эту запись мы и будем выводить на экран. Для этого пропишем соединение с сервером MySQL, выберем БД для работы и запросом выберем необходимые данные (все это мы уже проделывали в ряде предыдущих уроков, а потому подробно останавливаться на объяснении всего этого — нет оснований):

<?php

header(«Content-type: text/html; Charset=utf-8»);

mysql_connect(«localhost», «root», «») or die(«Can’t connect to server»);

mysql_query(«SET NAMES ‘utf8′») or die(«Can’t set charset»);

mysql_select_db(«charset») or die(«Can’t select DB»);

$res = mysql_query(«SELECT `text` FROM `test` WHERE `id`=». 1) or die(mysql_error());

$row = mysql_fetch_assoc($res);

?>

Теперь в массиве $row мы имеем искомую строку. Давайте выведем ее в теле страницы (между тегами body):

<?php

echo $row[‘text’];

?>

Если сейчас открыть страницу в браузере, то увидим опять-таки вместо читабельного текста вопросительные знаки. Так произошло оттого, что браузер (согласно отосланных заголовков) открыл страницу в юникоде, но информация из БД достается в кириллической кодировке. Как это исправить? Очень просто — достаточно после соединения с сервером БД указать в запросе кодировку соединения, тогда данные из БД будут отдаваться в искомой кодировке.

Пропишем необходимый запрос после соединения:

mysql_connect(«localhost», «root», «») or die(«Can’t connect to server»);

mysql_query(«SET NAMES ‘utf8′») or die(«Can’t set charset»);

Теперь после обновления страницы информация выводится корректно.
Вот и вся хитрость.

Заключение

Стоит обратить внимание на отличия в именовании кодировок в MySQL от традиционного их именования, т.е. того, к которому мы привыкли. Например, указать юникод правильно так — «utf8», но не так — «utf-8». Второй вариант серверу MySQL будет непонятен. Аналогично с кириллицей: правильно так — «cp1251», но не так — «windows-1251».

На этом наш урок подходит к концу. Теперь, если Вы будете использоваться в своей работе озвученные выше правила, то проблем с кодировками у вас будет гораздо меньше.

Надеюсь, данный урок был полезен для Вас. Если у Вас остались какие-либо вопросы, то я с удовольствием отвечу на них в комментариях.

Автор: Кудлай Андрей

Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля

Получить курс сейчас!

Разработка веб-приложения на PHP

Скачайте видеокурс и узнайте, как создать веб-приложение на PHP

Скачать

When a server sends a document to a user agent (eg. a browser) it also sends information in the Content-Type field of the accompanying
HTTP header about what type of data format this is. This information is expressed using a MIME type label. This article provides a starting point for
those needing to set the encoding information in the HTTP header.

You should look elsewhere for information about how to declare
character encoding in HTML pages, or how to find out how to check the
character encoding information being sent in an HTTP header.

The charset parameter

Documents transmitted with HTTP that are of type text, such as text/html, text/plain, etc., can send a charset parameter in the HTTP header to specify the character encoding of the document.

It is very important to always label Web documents explicitly. HTTP 1.1 says that the default charset is
ISO-8859-1. But there are too many unlabeled documents in other encodings, so browsers use the reader’s preferred encoding when there is no explicit
charset parameter.

The line in the HTTP header typically looks like this:

Content-Type: text/html; charset=utf-8

In theory, any character encoding that has been registered with IANA can be
used, but there is no browser that understands all of them. The more widely a character encoding is used, the better the chance that a browser will
understand it. A Unicode encoding such as UTF-8 is a good choice for a number of reasons.

Server setup

How to make the server send out appropriate charset information depends on the server. You will need the appropriate administrative
rights to be able to change server settings.

Apache. This can be done via the AddCharset (Apache 1.3.10 and later) or AddType directives, for directories or individual resources (files). With AddDefaultCharset (Apache 1.3.12 and later), it is possible to set the
default charset for a whole server. For more information, see the article on Setting ‘charset’ information in .htaccess.

Jigsaw. Use an indexer in JigAdmin to associate extensions with charsets, or set the charset directly on a resource.

IIS 5 and 6. In Internet Services Manager, right-click «Default Web Site» (or the site you want to
configure) and go to «Properties» => «HTTP Headers» => «File Types…» => «New Type…». Put in the extension you want to map, separately
for each extension; IIS users will probably want to map .htm, .html,… Then, for Content type, add «text/html;charset=utf-8» (without the
quotes; substitute your desired charset for utf-8; do not leave any spaces anywhere because IIS ignores all text after spaces). For IIS 4, you
may have to use «HTTP Headers» => «Creating a Custom HTTP Header» if the above does not work.

Scripting the header

The appropriate header can also be set in server side scripting languages. For example:

Perl. Output the correct header before any part of the actual page. After the last header, use a double
linebreak, e.g.:
print "Content-Type: text/html; charset=utf-8nn";

Python. Use the same solution as for Perl (except that you don’t need a semicolon at the end).

PHP. Use the header() function before generating any content,
e.g.:
header('Content-type: text/html; charset=utf-8');

Java Servlets. Use the setContentType method on the ServletResponse before obtaining any
object (Stream or Writer) used for output, e.g.:
resource.setContentType ("text/html;charset=utf-8");
If you use a Writer, the Servlet automatically takes care of the conversion from Java Strings to the encoding selected.

JSP. Use the page directive e.g.:
<%@ page contentType="text/html; charset=UTF-8" %>
Output from out.println() or the expression elements (<%= object%>) is automatically
converted to the encoding selected. Also, the page itself is interpreted as being in this encoding.

ASP and ASP.Net. ContentType and charset are set independently, and are methods on the response object.
To set the charset, use e.g.:
<%Response.charset="utf-8"%>
In ASP.Net, setting Response.ContentEncoding will
take care both of the charset parameter in the HTTP Content-Type as well as of the actual encoding of the document sent out (which of course have to
be the same). The default can be set in the globalization element in Web.config (or Machine.config, which is originally set to UTF-8).

Further reading

  • Setting charset information in .htaccess

  • Checking HTTP Headers

  • Tutorial, Handling character encodings in HTML and CSS

  • Related links, Setting up a server

    • Characters
    • Setting the HTTP charset parameter
  • Related links, Authoring HTML & CSS

    • Characters
  • Related links, Authoring SVG

    • Characters

За последние 24 часа нас посетили 10152 программиста и 1254 робота. Сейчас ищет 371 программист …


  1. xak2

    1. $headers  = «Content-type: text/html; charset=windows-1251 rn«;
    2. $headers .= «From: Administration <info@equip.lv>rn«;
    3. $headers .= «Bcc: [email=info@equip.lv]info@equip.lv[/email]rn«;
    4. $subject = ‘Тестовое письмо’;
    5. /*for($i = 0; $i < mysql_num_rows($mails); $i++) {
    6.     mail($result[‘mails’], $m_subj, $m_mess, $m_head);
    7. mail([email=‘info@equip.lv]’info@equip.lv[/email]‘, $subject, $message, $headers);

    Текст и заголовок приходят каракулями хотя стоит кодировка вин 1251… чт оя только уже не перепробывал. В чем проблема?


  2. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    xak2

    ну как минимум заголовок надо кодировать

    Content-type: text/plain; charset=windows-1251 пробелл на конце не мешает?

    пошли письмо на 440hz@440hz.ru — я посмотрб чито там на самом деле


  3. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    text/html

    ты же шлешь plain/text ?


  4. xak2

    А какая разница? Ведь хтмл может не содержать тегов? Или при этом условии необходины теги <body> и <html>?


  5. xak2

    1. $subject = ‘Тестовое письмо (text/plain)’;
    2. $headers  = «Content-type: text/plain; charset=windows-1251rn«;
    3. $headers .= «From: Administration <info@equip.lv>rn«;
    4. $headers .= «Bcc: [email=info@equip.lv]info@equip.lv[/email]rn«;
    5. /*for($i = 0; $i < mysql_num_rows($mails); $i++) {
    6.     mail($result[‘mails’], $m_subj, $m_mess, $m_head);
    7. mail([email=‘440hz@440hz.ru]’440hz@440hz.ru[/email]‘, $subject, $message, $headers);

    Выслал и в text/plain и text/html, убрал пробел, всеравно тотже результат. Сматри.


  6. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда


  7. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    xak2

    1.  $headers  = «Content-type: text/html; charset=windows-1251rn«;
    2.  $headers .= «From: 440hz <440hz@440hz.ru>rn«;
    3.  $subject = ‘Тестовое письмо’;
    4.  mail([email=‘440hz@440hz.ru]’440hz@440hz.ru[/email]‘, $subject, $message, $headers);
    1. Return-path: <440hz@hosting.440hz.ru>
    2. Envelope-to: 440hz@440hz.ru
    3. Delivery-date: Thu, 10 Jan 2008 19:08:38 +0300
    4. Received: from localhost.440hz.ru ([127.0.0.1]:63041 helo=hosting.440hz.ru)
    5.         by hosting.440hz.ru with esmtps (TLSv1:AES256-SHA:256)
    6.         (envelope-from <440hz@hosting.440hz.ru>)
    7.         for 440hz@440hz.ru; Thu, 10 Jan 2008 19:08:38 +0300
    8. Received: (from root@localhost)
    9.         by hosting.440hz.ru (8.13.6/8.13.6/Submit) id m0AG8biu083840;
    10.         Thu, 10 Jan 2008 19:08:37 +0300 (MSK)
    11. Date: Thu, 10 Jan 2008 19:08:37 +0300 (MSK)
    12. Message-Id: <200801101608.m0AG8biu083840@hosting.440hz.ru>
    13. Content-type: text/html; charset=windows-1251
    14. From: 440hz <440hz@440hz.ru>

    у меня все кажет нормально

    ты в чем смотришь-то?


  8. xak2

    С заголовком разобрался на gmail.com и мой ящик приходит норм по-русски. А сам текст сообщения всеравно карявый.

    1. $subject = ‘Тестовое письмо (text/html)’;
    2. $message = ‘Тестовое письмо’;
    3. $headers  = «Content-type: text/html; charset=windows-1251rn«;
    4. $headers .= «From: Administration <info@equip.lv>rn«;
    5. mail([email=‘info@equip.lv]’info@equip.lv[/email]‘, $subject, $message, $headers);
    1. Тестовое письмо


  9. xak2

    Да и вторая проблема, пользователи сайта, например при востановлении пароля поулчают письма с паролем как СПАМ? Некоторые клиенты да другие нет. Эт окакто решается?


  10. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    $message = iconv(‘utf-8′,’cp1251′,’Тестовое письмо’);


  11. xak2

    Спасибо! Заработал. Но как быть с спамом? Нзакрыватьже регистрацию дял тех у кого ящики блокируют такие письма. Таже история при отсылки сообщеняи потверждения…


  12. Sergey89

    Sergey89
    Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0

    Тело письма, тоже, не плохо бы бейсом кодировать.

  13. гыгы :) вместо того, чтобы прописать правильный хеадер мы будем каждый раз конвертировать из одной кодировки в другую…

  • #1

Странная кодировка при отсылке через mail()

При переезде хостинга возникла такая проблема:
При отправке писем в формате HTML, письмо приходит с битой кодировкой. В поле «Тема», где встречаются русские буквы, все русские символы заменяются на знаки «XXXXX». А в теле письма все русские символы меняются на «???????». Причём, это видно и в web-mail’е, и в почтовой программе типа Outlook.
Вот кусок кода, но на предыдущем хостинге он работал корректно. Всё отображалось правильно.

PHP:

$message='<html><head><title>&nbsp;</title></head><body>Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table></body>
</html>';

$headers = "MIME-Version: 1.0rn";
$headers.= "Content-type: text/html; charset=windows-1251rn";
$headers.= "To: info <[email protected]>rn";
$headers.= "From: $k_f <$k_e>rn";
$subject = "Заказ с сайта";
mail("$email", $subject, $message, $headers);

Грешу на неправильно собранный PHP. Может, что-то забыл при сборке?

OC: Fedora Core 2, PHP 5.1.2, Apache 2.0.

  • #2

Откуда берутся данные?
Пробовал менять кодировку полученного письма?

  • #3

Pustota
а покажи заголовки пришедшего битого письма или отправь это письмо мне на мыло? [email protected]. вернее пусть скрипт отправит письмо?

  • #4

Кодировку менял — не помогает. Данные из скрипта берутся. Я просто опустил оставшуюся часть.

Сейчас отправил себе на другой email. Пришло всё нормально. Не значит ли это, что проблема в почтовом сервере, а совсем не в PHP?

  • #5

Вообщето в заголовок письма нельзя пихать 8-битные символы. Читай rfc. Надо кодировать в base64 или quoted-printable Отсюда и XXXXXXX Некоторые почтовые системы заменяют все 8-битные символы на XXXXXXX Чтобы так не было — сделай
$subject = «=?Windows-1251?B?».base64_encode(«Заказ с сайта»).»?=»;
и точно так же
$headers.= «From: =?Windows-1251?B?».base64_encode($k_f).»?= <$k_e>rn»;
И еще добавь
$headers .= «Content-Transfer-Encoding: 8bit»;

  • #7

sidor
А само тело письма кодировать не надо? Там у меня тоже везде ????? вместо руссих символов.
И ещё, грешу на почтовый сервер (тоже сам ставил ;) ). Пробовал отослать на другое мыло — там все эти 8-битные символы нормально отобразились.

  • #8

Не надо само тело.
$headers .= «Content-Transfer-Encoding: 8bit»;
Вот это уберет тебе знаки вопросов
А на почтовый сервер грешить не надо. Он все правильно делает :)

  • #9

PHP:

$message='<html><head><title>&nbsp;</title>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
</head><body>Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table></body>
</html>';

$headers = "MIME-Version: 1.0rn";
$headers.= "Content-type: text/html; charset=windows-1251rn";
$headers.= "Content-Transfer-Encoding: 8bitrn";
$headers.= "To: info <[email protected]>rn";
$headers.= "From: siteuser <$k_e>rn";
$subject = "=?Windows-1251?B?".base64_encode("Заказ с сайта")."?=";
mail($email, $subject, $message, $headers);

Переделал вот под такой вид.
Тема теперь отображается правильно, но сообщение всё равно состоит из одних ?????????.
И к тому же HTML не преобразует. И заголовки показывает в теле сообщения.
Есть вероятность, что всё это из-за того, что сообщение в headers запихивается. Но вроде синтаксис функции mail() я правильно написал…
Посмотрите, может кто что посоветует…

  • #10

Давай сюда все заголовки и начало тела письма. Чтоб попали твои заголовки и тег <html>

  • #11

Вот что сыпется:

Код:

Return-Path: <[email protected]>
Received: from mail.site.ru ([unix socket])
         by hXXXXXXXXXXXXX (Cyrus v2.3.3) with LMTPA;
         Fri, 05 May 2006 13:02:44 +0400
X-Sieve: CMU Sieve 2.3
Received: by mail.site.ru (Postfix, from usXXXXXXXXXXXXXX)
        id 7A714F9E09B; Fri,  5 May 2006 13:02:44 +0400 (MSD)
To: [email][email protected][/email]
Subject: =?Windows-1251?B?x+Dq4Ocg8SBpbnRydXN0LXRvdXIucnU=?=
MIME-Version: 1.0
Message-ID: <[email protected]>
Date: Fri, 05 May 2006 13:02:44 +0400

Content-type: text/html; charset=windows-1251
Content-Transfer-Encoding: 8bit
To: info <[email protected]>
From: siteuser <[email protected]>
Message-Id: <[email protected]>
Date: Fri,  5 May 2006 13:02:44 +0400 (MSD)


<html><head><title>.......

Причём, когда просто открываешь письмо, тело начинается со строки «Content-type: text/html; chars….»

Да, ещё странно то, что в web-интерфейсе почты русские символы в теле письма отображаются в знаках вопроса, а при сохранении письма на диск все русские буквы видны нормально.

  • #12

Попробуй убрать $headers = «MIME-Version: 1.0rn»;
Есть у меня подозрение, что встретив второй заголовок MIME-Version: 1.0 почтовка (или еще кто-то) его заменяют на пустую строку и из-за этого у тебя твои заголовки попадают в тело письма…

  • #13

Вау. Спасибо тебе огромное. Тепеь намного лучше стало. Теперь начал понимать HTML.
Но ещё в тело письма в самом начале HTML кидает строку:

Код:

Content-Transfer-Encoding: 8bit
To: info 
From: siteuser 
Message-Id: 
Date: Fri,  5 May 2006 13:50:01 +0400 (MSD)

От этого реально избавиться?

  • #14

Так блин…:) То засада, то измена. Давай опять все заголовки и код, как у тебя сейчас хедеры создаются. :)

  • #15

Это заголовки:

Код:

Return-Path: <[email protected]>
Received: from mail.site.ru ([unix socket])
         by hXXXXXXXXXXXX (Cyrus v2.3.3) with LMTPA;
         Fri, 05 May 2006 13:50:01 +0400
X-Sieve: CMU Sieve 2.3
Received: by mail.site.ru (Postfix, from usXXXXXX)
        id 394BFF9E09B; Fri,  5 May 2006 13:50:01 +0400 (MSD)
To: [email][email protected][/email]
Subject: =?Windows-1251?B?x+Dq4Ocg8SBpbnRydXN0LXRvdXIucnU=?=
Content-type: text/html; charset=windows-1251
Message-ID: <[email protected]>
Date: Fri, 05 May 2006 13:50:01 +0400

А это в начале HTML пришедшего (сделал с просмотра HTML кода):

Код:

PHP:

$message='Заказ номер '.$id.'
<table cellpadding="2" cellspacing="0" border="01" bordercolor="#00619C" width="50%" align="center">
<tr valign="top" bgcolor="#63A6FF">
<td colspan="2" class="h_td">Контактная информация</td>
</tr>
<tr>
    <td><b>ФИО</b></td>
    <td>'.$k_f.'</td>
</tr>
<tr>
    <td><b>Тел.</b></td>
    <td>'.$k_t.'</td>
</tr>
<tr>
    <td><b>E-mail</b></td>
    <td>'.$k_e.'</td>
</tr>
<tr>
    <td><b>Примечание</b></td>
    <td>'.$k_p.'</td>
</tr>
</table>';

$headers= "Content-type: text/html; charset=windows-1251rn";
$headers.= "Content-Transfer-Encoding: 8bitrn";
$headers.= "To: info <[email protected]>rn";
$headers.= "From: siteuser <$k_e>rn";
$subject = "=?Windows-1251?B?".base64_encode("Заказ с сайта")."?=";
mail($email, $subject, $message, $headers);

  • #16

Теперь попробуй так:
Вертай взад $headers = «MIME-Version: 1.0rn»;
и в заголовках попробуй поменять все rn просто на n

  • #18

Значит почтовка принимает последовательность rn как два перевода строки. Это конечно не есть гуд. Насколько я понял — это не соответствует rfc. Надо бы с почтовкой разбираться.

  • #19

Дайте линк, где этот пресловутый RFС можно почитать. :)

  • #20

http://rfc.net/rfc2822.html

Понравилась статья? Поделить с друзьями:
  • Header content type text xml charset windows 1251
  • Head cleaning epson скачать бесплатно для windows 10
  • He open the windows as it was stuck
  • He cleaned the windows and earned 20
  • He came into the room to shut the windows while