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