Советы по PHP: Отправка писем при помощи PHP. Как расшифровать иероглифы в электронном письме

Отправка писем при помощи 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);

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

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

Часто средствами 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, кодировка, имя отправителя

Встроенный почтовый клиент Mac OS X с логичным и незамысловатым названием Mail есть за что похвалить — например, за развитую систему фильтрации писем на основе правил, за поддержку дополнительных плагинов, расширяющих возможности почты (вроде шифрования), за тесную интеграцию с клиентом iPhone и т.д. Но поводов для недовольства у пользователей Mail тоже хватает, особенно если они проживают не в англоговорящих странах. Главный повод — кодировка . Пожалуй, нет ни одного русского владельца Мака, который не сталкивался в Mail.app с тем, что принято называть словом «кракозябры» — это символьные шедевры вроде ÈØàÞÚÐï íÛÕÚâàØäØÚÐæØï, аЈаИб�аОаКаАб� б�аЛаЕ или даже Широкая электрРв названиях тем, содержимом писем или именах вложений.

Сегодня мы расскажем вам о сущности этой проблемы и некоторых путях её решения.

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

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

Зато возможно повлиять на этот процесс косвенно. Набор кодировок, которые Mail использует для распознания, зависит от набора используемых всей системой кодировок . А Этот набор, в свою очередь, зависит от количества используемых системой языков . Отсюда вытекает первый совет — удалите из системы все неиспользуемые вами языки.

Зайдите в Системные настройки , выберите пульт «Язык и текст», и увидите следующий список:

Нажмите на кнопку «Редактировать список» и снимите соответствующие галочки. После этого перезагрузите компьютер или завершите сеанс.

Представленный скриншот сделан в системе Mac OS X 10.6.2. В Mac OS X 10.5 данный пульт настроек устроен несколько иначе, однако редактирование списка языков там организовано почти так же.

Следующий шаг — это настройки самого клиента Mail. Как мы уже сказали, в программе не предусмотрено никаких постоянных настроек кодировки. Но это не значит, что их нет вообще. На самом деле, через Терминал всё-таки можно заставить Mail работать с определённой кодировкой .

Но перед тем, как задать кодировку по умолчанию, надо узнать, какая это должна быть кодировка. Это придётся делать экспериментальным путём:

  1. найдите несколько писем с кракозябрами
  2. выберите первое и зайдите в меню Сообщение — Кодировка текста
  3. последовательно перепробуйте все кодировки, начинающиеся со слова «Кириллическая» (KOI8-R, ISO 8859-5, Windows), а также UTF-8
  4. если письмо стало читабельным, посмотрите на остальные письма: если и их можно прочесть, то считайте, что решение найдено
  5. в противном случае продолжайте перебор кодировок

Если вы нашли подходящую кодировку, то останется её зафиксировать. Скорее всего, это будет либо кодировка KOI8-R, либо UTF-8 . Полностью завершите Mail (по комбинации Cmd+Q) . Запустите Терминал (через Spotlight или из папки Программы/Служебные программы ), и введите команду:

defaults write com.apple.mail NSPreferredMailCharset koi8-r

defaults write com.apple.mail NSPreferredMailCharset utf-8

После чего нажмите Enter и закройте Терминал.

Если не хотите возиться с Терминалом, то можете установить и сменить кодировку через него:


Если предложенный выше вариант не сработает, попробуйте прописать через Терминал ещё один параметр:

defaults write com.apple.mail LeopardPreferredMailCharset utf-8

(или defaults write com.apple.mail LeopardPreferredMailCharset koi8-r)

Возможно, это поможет вам избавиться от проблем с кодировкой в темах и тексте писем. С русскими именами вложений ситуация ещё более загадочна. Многолетние наблюдения позволяют говорить о том, что в их порче виноват вовсе не Mail, а отправляющая почту программа. Например, известен глюк с письмами из Thunderbird — практически всегда имена вложений на русском приходят на Мак испорченными. Для решения этой проблемы в самом Thunderbird необходимо изменить значение параметра mail.strictly_mime.parm_folding равным единице.

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

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

{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}