Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Валидный набор заголовков для mail()
 
 автор: DDK   (01.02.2012 в 17:48)   письмо автору
 
 

Приветствую!

Ищу пример валидных заголовков для отправки почты функцией mail().

Контент изначально в UTF-8, русский, в формате HTML. Сейчас используется следующая функция, но письма многим совсем не доходят, а у большинства сразу попадают в спам (и дело точно не в репутации домена):


        public function send_mail(
                                $name_to, // имя получателя
                                $email_to, // email получателя
                                $subject, // тема письма
                                $body, // текст письма
                                $html = FALSE // письмо в виде html или обычного текста
                            ) 
        {            
            $name_from = $this->sendmail_config['sender_name'];
            $email_from = $this->sendmail_config['sender_email'];
                                
            $data_charset = 'UTF-8'; // кодировка переданных данных
            $send_charset = 'KOI8-R'; // кодировка письма
            
            $to = $this->mime_header_encode($name_to, $data_charset, $send_charset) . ' <' . $email_to . '>';
            $subject = $this->mime_header_encode($subject, $data_charset, $send_charset);
            $from =  $this->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: " . $from . "\r\n";
            $type = ($html) ? 'html' : 'plain';
            $headers .= "Content-type: text/" . $type . "; charset=" . $send_charset . "\r\n";
            $headers .= "Mime-Version: 1.0\r\n";
            $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
            
            if( !DEBUG_SYSTEM ) 
                mail($to, $subject, $body, $headers);
            
            return;
        }

        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) . '?=';
        }

  Ответить  
 
 автор: ladan   (01.02.2012 в 19:57)   письмо автору
 
   для: DDK   (01.02.2012 в 17:48)
 


<?
$mail 
= "";    
$subject = "";
$message = "";
$headers = "From: site.ru <admin@site.ru>\r\ncontent-type:text/plain; charset=utf-8\r\n";
mail ($mail, $subject, $message, $headers);
?>

  Ответить  
 
 автор: DDK   (02.02.2012 в 00:32)   письмо автору
 
   для: ladan   (01.02.2012 в 19:57)
 

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

  Ответить  
 
 автор: DDK   (02.02.2012 в 00:40)   письмо автору
 
   для: DDK   (02.02.2012 в 00:32)
 

И проблема с не доходящими письмами возвращается сразу, как только добавляешь всего одну строку:

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

  Ответить  
 
 автор: DDK   (02.02.2012 в 15:50)   письмо автору
 
   для: DDK   (01.02.2012 в 17:48)
 

Всё, разобрался. Вот правильный код:


<?

        
public function send_mail(
                                
$name_to, // имя получателя
                                
$email_to, // email получателя
                                
$subject, // тема письма
                                
$body, // текст письма
                                
$html = FALSE // письмо в виде html или обычного текста
                            
) 
        {            
            
$name_from = $this->sendmail_config['sender_name'];
            
$email_from = $this->sendmail_config['sender_email'];
                                
            
$data_charset = 'UTF-8'; // кодировка переданных данных
            
$send_charset = 'UTF-8'; // кодировка письма
            
            
$to = '"' . $this->mime_header_encode($name_to, $data_charset, $send_charset) . '" <' . $email_to . '>';
            
$subject = $this->mime_header_encode($subject, $data_charset, $send_charset);
            
$from =  '"' . $this->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: " . $from . "\r\n";
            
$type = ($html) ? 'html' : 'plain';
            
$headers .= "Reply-To: " . $from . "\r\n";
            
$headers .= "Return-Path: " . $from . "\r\n";
            
$headers .= "Content-type: text/" . $type . "; charset=\"" . $send_charset . "\"\r\n";
            
$headers .= "Mime-Version: 1.0\r\n";
            
$headers .= "X-Mailer: " . $name_from . " PHP Mailer\r\n";
            
$headers .= "X-Priority: 3\r\n";
            
$headers .= "X-MSMail-Priority: Normal\r\n";
            
            if( !
DEBUG_SYSTEM ) 
                
mail($to, $subject, $body, $headers);
            
            if( 
$this->sendmail_debug )
            {
                
$this->mail_debug($to, $subject, $body, $headers);
            }
            
            return;
        }

        private 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) . '?=';
        }

?>


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


<?
...
$to = '"' . $this->mime_header_encode($name_to, $data_charset, $send_charset) . '" <' . $email_to . '>';
$from =  '"' . $this->mime_header_encode($name_from, $data_charset, $send_charset) .'" <' . $email_from . '>';
...
$headers .= "Content-type: text/" . $type . "; charset=\"" . $send_charset . "\"\r\n";
...
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования