Кодировка писем. Синтаксис функции mail()

Отправка писем при помощи PHP

Общие возможности

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

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

Синтаксис функции mail():

Bool mail(string $to, string $subject, string $msg [, string $header]);

Чтобы было более понятно, что из себя представляют заголовки, и где они находятся в письме, откройте почтовый клиент и посмотрите на любое письмо в том виде, как оно пришло (Для Outlook это можно сделать нажав правой клавишей мыши на сообщение->Свойства->Подробно->Исходное сообщение ).

Как мы видим, письмо представляет простой текстовой файл, состоящий из двух общих разделов: Вверху идут заголовки письма, затем через две строки идет само письмо.

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

Вот некоторые наиболее часто используемые:

  • From: "Имя пользователя отправителя" <Обратный адрес отправителя>
  • To: <Адрес, по которому отправляют письмо>
  • Subject: Тема письма

Решение проблемы кодировок

Я не зря выше привел пример отправки письма со словами латинского алфавита. Их любой почтовый клиент прочтет без труда. Но вот с русским алфавитом труднее. Русских кодировок существует огромное множество. И от того, насколько умело Вы перекодируете письмо, будет зависеть прочтет ли получатель его, или не будет возиться с установкой нужной кодировки и просто удалит его в корзину.

Кодировку письма задает заголовок Content-type :

$header="From: \"Evgen\" "; $header.="Content-type: text/plain; charset=\"windows-1251\""; $subject="Тема письма"; $msg="Сторака 1\nСтрока 2\nСтрока 3"; mail("

В заголовке мы указали, что тип письма будет простой текст, а кодировка - Windows.

Теперь наше письмо придет в понятной для почтового клиента кодировке.

Но стоит отметить, что в некоторых случаях в правильной кодировке будет отображено только само письмо. Заголовок же так и останется нечитаемым. Связано это с тем, где расположен заголовок Content-type относительно заголовка Subject , который и содержит тему письма. Дело в том, что существуют почтовые программы, которые понимают заголовок Content-type , но не понимают русский текст в поле Subject , если это поле стоит до Content-type . В то же время, другие почтовые программы обязывают нас задавать Content-type последним заголовком в списке. Чтобы обойти эти препятствия, можно разместить поле Content-type сразу в начале и в конце списка заголовков:

$subject="Тема письма"; $header="Content-type: text/plain; charset=\"windows-1251\""; $header.="From: Evgen "; $header.="Subject: $subject"; $header.="Content-type: text/plain; charset=\"windows-1251\""; $msg="Сторака 1\nСтрока 2\nСтрока 3"; mail(" ", $subject, $msg, $header);

Теперь это письмо прочтет любая почтовая программа!

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

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

Однако как-то раз мне пришло очень важно письмо, которое я долго ждал, но оно тоже состояло из кракозябр вместо букв . Смысл его мне надо было выяснить во что бы то не стало, поэтому я начал искать, как можно расшифровать текст в таких случаях.


Оказывается подобные проблемы возникают, когда письмо пишется без указания кодировки, а почтовый клиент, пытаясь сам подобрать нужную кодировку, часто делает это неправильно. Прочесть письмо в таком случае можно несколькими способами:
  • указать почтовому клиенту вручную правильную кодировку
  • воспользоваться онлайн декодером (дешифратором) почты

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

Декодер Лебедева – один из онлайн инструментов на сайте самой крупной и известной дизайн-студии в России. Он поддерживает более двух десятков видов кодировок, как распространенных, так и довольно экзотичных: UTF-8, KOI8, ASCII, CP-1251, Shift_JIS, Base64, HTML-entities и др.

Декодер Лебедева имеет два режима работы, которые называются: «просто» и «сложно».

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

В сложном режиме Вы можете вручную выбирать кодировки как исходного так и полученного текста, хотя честно говоря, не знаю, когда это может пригодиться. Лично мне всегда хватало простого режима работы — декодер Лебедева справлялся во всех случаях на УРА.

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


Заранее предвижу замечания некоторых моих постоянных читателей о том, что подобные сервисы попросту крадут Вашу личную информацию в своих корыстных целях. Но на это у меня есть ответ в духе Артемия Лебедева: «не хотите – не пользуйтесь». Этот продукт лишь для тех, кто не страдает манией преследования и тотальной слежки со стороны Большого брата. А то, что в этом году данный декодер отпраздновал уже 15 лет своей жизни, кое о чем да говорит…

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

Приходилось ли вам получать электронные письма, в которых на вас вместо родных русских букв пугающе смотрят непонятные символы? Спам мы в расчет не берем. Иногда очень важные нам люди присылают очень важную почту, которую невозможно прочитать. Или все-таки возможно? Давайте разберемся!

{mosloadposition debug}

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

Прежде всего, разберемся, почему написанное человеком на родном языке письмо вообще попадает к нам в виде непонятных символов. Дело в том, что отправитель письма создает его, используя неправильную или отличающуюся от настроек вашей почтовой программы кодировку. Напомним, что кодировкой называется соответствие определенному символу языка какого-либо конкретного знака, буквы, цифры. Для кириллических алфавитов, к коим относится наш русский язык, применяется кодировка Windows-1251. В почтовых программах необходимо использовать кодировку Кириллица (KOI8-R).

Как же решить проблему с нечитабельными символами в электронном письме? Очень просто! Достаточно указать почтовой программе ту кодировку, с использованием которой было создано данное письмо. Здесь можно либо включить опцию «Автоопределение» в настройках почтового клиента либо перебирать кодировки до тех пор, пока текст не обретет читабельный вид.

Давайте рассмотрим распространенные почтовые программы и выясним, как же поменять кодировку в каждой из них.

Почта Windows

Если для работы с электронной почтой вы используете программу «Почта Windows», изменить кодировку можно следующим образом. Дважды щелкните по нечитабельному письму. В открывшемся окошке в меню «Вид» выберите «Кодировка». Для начала попробуйте отметить «Кириллица (KOI8-R)».

Если письмо так и останется нечитабельным, щелкните пунктик «Дополнительно», за которым прячется довольно внушительный список доступных кодировок. К сожалению, отвечающая за автоматическое определение кодировки опция здесь отсутствует, поэтому придется действовать методом перебора, отмечая последовательно каждую кодировку из предлагаемого списка.


Когда подходящая кодировка будет найдена, письмо обретет читабельный вид.

Microsoft Outlook

В почтовой программе Outlook из пакета Microsoft Office 2007 выбрать нужную кодировку так же просто. Достаточно дважды щелкнуть по письму из папки «Входящие», а в открывшемся окошке с содержанием письма выбрать «Другие действия» - «Кодировка». Как и ранее, первой отмечаем «Кириллица (KOI8-R)». Если текст письма не приобрел понятный русскому человеку вид, то начинаем действовать методом перебора. Все доступные кодировки находятся за опцией «Дополнительно».


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


Здесь в качестве кодировки исходящих сообщений должно быть указано «Кириллица (KOI8-R)».

Outlook Express

В почтовой программе Outlook Express, по умолчанию установленной в Windows XP, кодировка меняется схожим с Почтой Windows образом. Открыв письмо с непонятными символами, следует выбрать в меню «Формат» пункт «Кодировка». Здесь перечислены несколько вариантов кодировок, а за опцией «Дополнительно» их скрывается еще пара десятков. Вам нужно лишь подобрать подходящую кодировку и, возможно, присланное электронное письмо обретет читабельный вид.

Opera Mail

В заключении мы решили рассмотреть интегрированный в браузер Opera почтовый клиент. Здесь все очень просто: кодировка меняется в настройках браузера через меню «Вид» - «Кодировка». Этот параметр затрагивает не только почту, но и веб-страницы.

Можете отметить «Выбирать автоматически» либо попробовать методом перебора из многочисленных вариантов. Конечно, впоследствии, когда письмо удастся прочитать, следует вернуть настройки обратно. Так, по умолчанию лучше использовать кодировку «Кириллица» - «Автоопределение».


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

Специально для Ячайник, Елена Карлтон

{mosloadposition cpanel}

Часто средствами PHP необходимо отправлять почту. Но как это сделать, чтобы письма приходили на максимально возможное количество разных почтовых систем?

На самом деле все очень просто, особенно, если ты знаешь где нажимать какие кнопочки. Но, чтобы найти действительно подходящее решение в данном вопросе, пришлось потратить много времени... А все мы помним, что время – это деньги!

Итак, приступим. Код письма может быть даже таким:

$date = date("Y-m-d H:i:s");
//email на который отправляем
$to = "";
//тема сообщения
$subject = "Новое сообщение. $date";
//как бы текст
$message = "





Текст письма



";
//headers
$headers = "Content-type: text/html; charset="utf-8"";
$headers .= "From: ИМЯ <ВАШ[email protected]>";
$headers .= "Reply-To: ";
mail($to, $subject, $message, $headers);
?>

Отправитель.

Важно понимать, что часть кода headres имеет очень важное значение. Т.к., например, mail.ru НЕ принимает письма, если Вы указываете автора письма (From), ненастоящего.
Т.е., например, Вы имеете сайт на сервере host.bo, при этом Mail.Ru знает, что письмо пришло оттуда, т.к. при отсылке письма отправляет еще и дополнительная информация, а не только та, которую Вы укажите.

Например:

Return-path:
Envelope-to: mailZero@сайт
Delivery-date: Mon, 16 Oct 2017 16:42:03 +0300
Received: from user by thehost.ua with local (Exim 666)
(envelope-from )
id 56565-0580J2-1d
for mailZero@сайт; Mon, 16 Oct 2017 16:42:02 +0300
To:
Subject: 2017-10-16 16:42:01 комментарий сайт
X-PHP-Originating-Script: 1708:script.php
Content-type: text/html; charset=utf-8
From:
Reply-To:
Message-Id: <[email protected]>
Date: Mon, 16 Oct 2017 16:42:02 +0300

NAME: Inverser.


EMAIL: mailZero@сайт


IP: 1.0.1.9


DATE: 2017-10-16 16:42:01


URL: сайт/42


TEXT: Андрей, не знаю, кто такой Лукас, но благодарю, видимо, что-то хорошее.

Поэтому, если, например, Вы укажите отправителем почту [email protected], то почтовая система Mail.Ru НЕ примет это письмо, так как будет «знать», что оно пришло не с её серверов, а с сервера host.bo.

Следующий параметр – кодировка.

Чтобы не было «кракозябр» или нечитаемых символов в письме, необходимо четко соблюсти правила.

$headers = "Content-type: text/html; charset="utf-8"";

должна быть именно ТАКОЙ, и никакой другой, если только Вы не используете другую кодировку (charset). Важную роль играют одинарные и двойные кавычки в этой строке. Желательно, чтобы она была именно такой, как указана выше, чтобы не было непонятных символов в письме:

Если в письме НЕ будет html тегов, а просто текст, то можно эту строку писать так:

$headers = "Content-type: text/plain ; charset="utf-8"";

авторитет 4 октября 2014 в 05:20

Кракозябрица в имени отправителя письма на почте Yandex

  • PHP ,
  • Программирование
Введение
Доброго времени суток, уважаемые!

Хочу кратенько поведать о проблеме отображения имени отправителя письма при отправке на ящики Яндекс.Почты и привести ее решение.

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

С чего все начиналось

Итак, есть самописный сайт на php + angular. Обычный лендинг с калькулятором.
Пришла очередь задаче по отправке писем клиентам и менеджерам о поступивших заказах.

Казалось бы, чего уж проще? Берешь и пишешь:

$headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . "From: Почтальон Симпатикович Зигнатуров " . PHP_EOL . "Reply-To: [email protected]" . PHP_EOL; $to = "[email protected], [email protected]"; $letter = "order!"; $result = mail($to, $subject, $letter, $headers);

При этом сохраняем файл в кодировке UTF-8 без BOM и выполняем.
Смотрим почтовый ящик gmail - все в порядке! Имя отправителя отображается вполне себе корректно:

Смотрим Яндекс - опять красота.

Уже открываю шампанское… Вот она, победа. Но не тут-то было.
Открываю письмо и вижу:

… та-дам! Кракозябрица.

Убираю шампанское, достаю бубны. Начинаю шерстить интернет в поисках решения, пишу в поддержку Яндекса.
Мне приходит ответ: «Попробуйте кодировать в base64». Что кодировать - я так и не понял. Пробовал кодировать кириллические символы и заголовок целиком.

Но приходит мысль: зачем изобретать велосипед? Надо посмотреть, как делают старшие товарищи по цеху. Открываю первое письмо и смотрю его свойства. Что же я там вижу?

Content-Type: text/html; charset=windows-1251 .... From: =?windows-1251?B?RkwucnU=?= Subject: =?windows-1251?B?ze7i++Ug7/Du5ery+yDt4CBGTC5ydQ==?=

Логика подсказывает, что заветное решение находится внутри символов "=?… ?=" (да простится мне серость моя сообществом мудрейших!).
Смотрю дальше и вижу кодировку windows-1251 . Так, еще один шаг к успеху! Подвигаю шампанское ближе.

Затем идет еще символ «B» и знак вопроса. Отбрасываю их, беру оставшийся код и смотрю, что же это такое?

Так, у меня файл с кодировкой utf-8. Сохраняю его как windows-1251 и запускаю снова.

Решение вопроса

Для файлов в кодировке utf-8 я использовал такое решение:

Function adopt($text) { return "=?UTF-8?B?".base64_encode($text)."?="; } $headers = "MIME-Version: 1.0" . PHP_EOL . "Content-Type: text/html; charset=utf-8" . PHP_EOL . "From: ".adopt("Почтальон Симпатикович Зигнатуров")." " . PHP_EOL . "Reply-To: [email protected]" . PHP_EOL; $to = "[email protected], [email protected]"; $letter = "order!"; $result = mail($to, adopt($subject), $letter, $headers);

Обратите внимание - тема письма также закодирована:

В результате я получил корректное отображение отправителя письма:

Прошу не судить строго за мой первый литературно-технический очерк. Буду благодарен профессиональным отзывам и дополнением материала.

Теги: php, email, кодировка, имя отправителя



Онлайн калькуляторы