Рейтинг@Mail.ru
 

Шаг 2

Функция mail

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

Казалось бы - чего проще, написал скрипт:
1
2
3
4
5
6
7
8
9
<?php

   $to 
'mail@mail.ru'
   
$subject 'Табе пакет'
   
$message 'Вот такое вот письмо';

   
mail($to$subject$message);
И жди весточку. Ведь ясно сказано - функция mail() принимает аргументами
1. Адрес получателя
2. Тему письма
3. Текс сообщения
4. (Необязательный параметр) Заголовки.

А не все так просто. Запустите этот скрипт на локалхосте и посмотрите, что находится в папке по адресу
Z:\tmp\!sendmail
Это так называемая почтовая заглушка, которая помогает в отладке подобного рода скриптов. Она перехватывает письма, отправленные Денвером и складывает туда.

Так вот, если Вы откроете письмо, то увидите примерно следующую картину:


Почему так? Да очень просто. Во первых, как уже было сказано, в тему письма нельзя допускать кирилицу. А как же быть? Ведь письмо хочется подписать по русски, а не абы как...

Можно воспользоваться транслитом. Но это еще смешнее. По этому будем делать грамотно - закодируем кирилицу согласно предписаниям. А они гласят:
Кодировать тему нужно по следующему алгоритму.
1
2
3
4
5

   $subject 
"=?utf-8?b?"base64_encode($subject) ."?=";


Что это такое. Сначала спецсимволы =? которые дают понять, что сейчас будет служебная информация.
Потом собственно сама кодировка utf-8.
Потом опять разделитель ? и способ кодирования b. Способа два - "Q-encoding" (обозначается буквой Q) и "Base64" (соответственно b).
Мы выбрали второй, по этому сам текст темы будем кодировать с помощью функции base64_encode()
Ну и далее опять комбинация символов, обознячающая конец темы: ?=

Исправим наш скрипт так:
1
2
3
4
5
6
7
8
9
10
<?php

   $to 
'mail@mail.ru'
   
$subject 'Табе пакет';
   
$subject "=?utf-8?b?"base64_encode($subject) ."?=";
   
$message 'Вот такое вот письмо';

   
mail($to$subject$message);
и посмотрим, что получится. Ага? Тема теперь видна нормально? То то.

А как же быть с самим сообщением? Тут тоже нет особых сложностей. Нужно просто напросто указать требуемую информацию в заголовках. Ведь по большому счету все сервера ведут себя примерно одинаково: есть инструкция - выполняют. Нет - творят что хотят. По этому лучше не искушать судьбу и прописать заголовки как положено. А положено так:
1
2
3
4
5
6
7
8
9
10
11
<?php

   $to 
'email@mail.ru'
   
$subject 'Табе пакет'
   
$subject '=?utf-8?b?'base64_encode($subject ) .'?='
   
$headers 'Content-type: text/plain; charset="utf-8"'
   
$message 'Вот такое вот письмо'
    
   
mail($to$subject$message$headers);


Тут мы указали тип письма (text/plain, то есть простой текст) и кодировку (utf-8). Запустите скрипт и полюбуйтесь - все теперь прекрасно видно.

Но радоваться рано. У нас в письме нет отправителя. А это верный признак того, что письмо будет расценено как спам и спам-фильтр порядочного почтового агента его заблокирует. Не будем писать анонимок, подпишемся:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<?php

          
   
$to 'email@mail.ru';       
   
$from 'email@yandex.ru'
   
$subject 'Табе пакет'
   
$subject '=?utf-8?b?'base64_encode($subject) .'?='
   
$headers "Content-type: text/plain; charset=\"utf-8\"\r\n"
   
$headers .= "From: "$from ." <"$from ."> \r\n";    
   
$message 'Вот такое вот письмо'
   
   
mail($to$subject$message$headers);

Если мы теперь откроем письмо в редакторе, то увидим такую картину:
X-Sendmail-Cmdline: sendmail.pl -t -i
To: email@mail.ru
Subject: =?utf-8?b?0KLQsNCx0LUg0L/QsNC60LXRgg==?=
Content-type: text/plain; charset="utf-8"
From: <email@yandex.ru> 


Вот такое вот письмо


что уже очень похоже на правду. Но для полного счастья еще не достаточно. Добавим пару жизненно важных заголовков:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

   $to 
'email@mail.ru';       
   
$from 'email@yandex.ru'
   
$subject 'Табе пакет'
   
$subject '=?utf-8?b?'base64_encode($subject) .'?='
   
$headers "Content-type: text/plain; charset=\"utf-8\"\r\n"
   
$headers .= "From: <"$from .">\r\n"
   
$headers .= "MIME-Version: 1.0\r\n"

   
$headers .= "Date: "date('D, d M Y h:i:s O') .
"\r\n"
   
$message 'Вот такое вот письмо'
   
   
mail($to$subject$message$headers);

Есть еще один нюанс. Очень часто хостер принудительно меняет адрес отправителя на свой. Что бы этого не произошло, нужно добавить четвертый параметр в функцию mail(). Им является обратный адрес, который предваряется символами -f (Без пробела, прямо так: -femail@yandex.ru)
1
2
3
4
5

mail
($to$subject$message$headers'-f'$from );

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

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