Функция mail

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

Казалось бы - чего проще, написал скрипт:
Код PHP
1
2
3
4
5
6
7
<?php
 
   $to = 'mail@mail.ru'; 
   $subject = 'Табе пакет'; 
   $message = 'Вот такое вот письмо';
 
   mail($to, $subject, $message);
И жди весточку. Ведь ясно сказано - функция mail() принимает аргументами 
1. Адрес получателя
2. Тему письма
3. Текс сообщения
4. (Необязательный параметр) Заголовки.

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

Почему так? Да очень просто. Во первых, как уже было сказано, в тему письма нельзя допускать кирилицу. А как же быть? Ведь письмо хочется подписать по русски, а не абы как...
Можно воспользоваться транслитом. Но это еще смешнее. По этому будем делать грамотно - закодируем кирилицу согласно предписаниям. А они гласят:
Кодировать тему нужно по следующему алгоритму.
Код PHP
1
$subject = "=?utf-8?b?". base64_encode($subject) ."?=";
Что это такое. Сначала спецсимволы =? которые дают понять, что сейчас будет служебная информация. 
Потом собственно сама кодировка utf-8.
Потом опять разделитель ? и способ кодирования b. Способа два - "Q-encoding" (обозначается буквой Q) и "Base64" (соответственно b).
Мы выбрали второй, по этому сам текст темы будем кодировать с помощью функции base64_encode()
Ну и далее опять комбинация символов, обознячающая конец темы: ?=
Исправим наш скрипт так:
Код PHP
1
2
3
4
5
6
7
8
<?php
 
   $to = 'mail@mail.ru'; 
   $subject = 'Табе пакет';
   $subject = "=?utf-8?b?". base64_encode($subject) ."?=";
   $message = 'Вот такое вот письмо';
 
   mail($to, $subject, $message);
и посмотрим, что получится. Ага? Тема теперь видна нормально? То то. 

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

Но радоваться рано. У нас в письме нет отправителя. А это верный признак того, что письмо будет расценено как спам и спам-фильтр порядочного почтового агента его заблокирует. Не будем писать анонимок, подпишемся:
Код PHP
1
2
3
4
5
6
7
8
9
10
11
12
<?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);
Если мы теперь откроем письмо в редакторе, то увидим такую картину:
\"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)
Код PHP
1
mail($to, $subject, $message, $headers, '-f'. $from );
Однако нужно знать, что не все хостеры это любят и всячески пытаются препятствовать. Иногда этот параметр становится причиной пустого почтового ящика.
Источник