За последние 24 часа нас посетили 42410 программистов и 7144 робота. Сейчас ищут 1375 программистов ...

От кого MAILER-DAEMON (через smtp)

Тема в разделе "PHP для новичков", создана пользователем mailmoney, 15 апр 2011.

  1. mailmoney

    mailmoney Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    18
    Симпатии:
    0
    Здравствуйте.
    Использую такой скрипт для отправки почты через smtp с авторизацией.
    Все хорошо, русские символы перекодировал. Но вот отправитель всегда пишется "От кого MAILER-DAEMON".
    Может какой новый стандарт, нужно закодировать или преобразовать кодировку для этого поля?
    Может кто помочь

    Код (Text):
    1. <?
    2. echo $pass;
    3.     error_reporting(E_ALL ^ E_WARNING);
    4.     ob_implicit_flush();
    5.  
    6.     $address = 'mail.*.ru'; // адрес smtp-сервера
    7.     $port    = 25;          // порт (стандартный smtp - 25)
    8.    
    9.     $login   = '';    // логин к ящику
    10.     $pwd     = '';    // пароль к ящику
    11.  
    12.    
    13.     $from    = 'webmaster@*.ru';  // адрес отправителя
    14.     $to      =$email_p1;  // адрес получателя
    15.    
    16.     $subject = '0101010';       // тема сообщения
    17.     $message = '
    18. Здравствуйте.
    19. Пароль для системы: '.$pass.'
    20. По вопросам системы обращайтесь';          // текст сообщения
    21.  
    22. $message = iconv("cp1251","KOI8-R",$message);
    23. $message = "Content-Type: text/plain; charset=\"koi8-r\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n".$message;
    24.  
    25. $subject=base64_encode(iconv("cp1251","KOI8-R",$subject));
    26. $subject="=?KOI8-R?B?{$subject}?=";
    27.  
    28.  
    29.  
    30.     try {
    31.        
    32.         // Создаем сокет
    33.         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    34.         if ($socket < 0) {
    35.             throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
    36.         }
    37.  
    38.         // Соединяем сокет к серверу
    39.         echo 'Connect to \''.$address.':'.$port.'\' ... ';
    40.         $result = socket_connect($socket, $address, $port);
    41.         if ($result === false) {
    42.             throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
    43.         } else {
    44.             echo "OK\n";
    45.         }
    46.        
    47.         // Читаем информацию о сервере
    48.         read_smtp_answer($socket);
    49.        
    50.         // Приветствуем сервер
    51.         write_smtp_response($socket, 'EHLO '.$login);
    52.         read_smtp_answer($socket); // ответ сервера
    53.        
    54.         echo 'Authentication ... ';
    55.            
    56.         // Делаем запрос авторизации
    57.         write_smtp_response($socket, 'AUTH LOGIN');
    58.         read_smtp_answer($socket); // ответ сервера
    59.        
    60.         // Отравляем логин
    61.         write_smtp_response($socket, base64_encode($login));
    62.         read_smtp_answer($socket); // ответ сервера
    63.        
    64.         // Отравляем пароль
    65.         write_smtp_response($socket, base64_encode($pwd));
    66.         read_smtp_answer($socket); // ответ сервера
    67.        
    68.         echo "OK\n";
    69.         echo "Check sender address ... ";
    70.        
    71.         // Задаем адрес отправителя
    72.         write_smtp_response($socket, 'MAIL FROM: <'.$from.'>');
    73.         read_smtp_answer($socket); // ответ сервера
    74.        
    75.        
    76.         echo "OK\n";
    77.         echo "Check recipient address ... ";
    78.        
    79.         // Задаем адрес получателя
    80.         write_smtp_response($socket, 'RCPT TO:<'.$to.'>');
    81.         read_smtp_answer($socket); // ответ сервера
    82.        
    83.         echo "OK\n";
    84.         echo "Send message text ... ";
    85.        
    86.         // Готовим сервер к приему данных
    87.         write_smtp_response($socket, 'DATA');
    88.         read_smtp_answer($socket); // ответ сервера
    89.        
    90.         // Отправляем данные
    91.         $message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя"
    92.         $message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения"
    93.         write_smtp_response($socket, $message."\r\n.");
    94.         read_smtp_answer($socket); // ответ сервера
    95.        
    96.         echo "OK\n";
    97.         echo 'Close connection ... ';
    98.        
    99.         // Отсоединяемся от сервера
    100.         write_smtp_response($socket, 'QUIT');
    101.         read_smtp_answer($socket); // ответ сервера
    102.        
    103.         echo "OK\n";
    104.        
    105.     } catch (Exception $e) {
    106.         echo "\nError: ".$e->getMessage();
    107.     }
    108.    
    109.     if (isset($socket)) {
    110.         socket_close($socket);
    111.     }
    112.    
    113.     // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
    114.     function read_smtp_answer($socket) {
    115.         $read = socket_read($socket, 1024);
    116.        
    117.         if ($read{0} != '2' && $read{0} != '3') {
    118.             if (!empty($read)) {
    119.                 throw new Exception('SMTP failed: '.$read."\n");
    120.             } else {
    121.                 throw new Exception('Unknown error'."\n");
    122.             }
    123.         }
    124.     }
    125.    
    126.     // Функция для отправки запроса серверу
    127.     function write_smtp_response($socket, $msg) {
    128.         $msg = $msg."\r\n";
    129.         socket_write($socket, $msg, strlen($msg));
    130.     }
    131. ?>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    mailmoney
    чувак, ты слыхал про функцию mail()?
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.639
    Симпатии:
    1
    igordata
    mail() умеет smtp с авторизацией?
    Расскажи мне об этом!
     
  4. mailmoney

    mailmoney Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    18
    Симпатии:
    0
    Да чувак, нужна авторизация SMTP
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    Volt(220)
    на винде - умеет. а на линухе это зачем?
    что за ситуация?
     
  6. mailmoney

    mailmoney Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    18
    Симпатии:
    0
    Стоит почтовый сервер свой. сервер вэб, он умеет отправлять только через smtp для того чтобы не попали в черные списки провайдеров майла яндекса и т.д.
    В общем проще разобраться со скриптом чем с серверами. Все cms до этого справлялись с этой функцией... а вот самописный, столкнулся с проблемами
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    mailmoney
    он умеет отправлять только через smtp для того чтобы не попали в черные списки провайдеров майла яндекса и т.д.
    это какой-то новый городской миф?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.639
    Симпатии:
    1
    Можно поподробнее?

    Почему это не нужно на линухе?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    Volt(220)
    в пхп ини прописывается логин и пароль вроде
     
  10. mailmoney

    mailmoney Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    18
    Симпатии:
    0
    Разобрался. Вот код верный.

    PHP:
    1. <?
    2. //echo $pass;
    3.     error_reporting(E_ALL ^ E_WARNING);
    4.  
    5.     $address = 'mail.*.ru'; // адрес smtp-сервера
    6.     $port    = 25;          // порт (стандартный smtp - 25)
    7.    
    8.     $login   = '';    // логин к ящику
    9.     $pwd     = '';    // пароль к ящику
    10.  
    11.    
    12.     $from    = 'webmaster@*.ru';  // адрес отправителя
    13.     $to      =$email_p1;  // адрес получателя
    14.    
    15.     $subject = 'Пароль для системы';       // тема сообщения
    16.     $message = '
    17. Здравствуйте. <br/>
    18. Пароль для системы: '.$pass.' <br/>
    19. По вопросам системы обращайтесь в
    20. ';          // текст сообщения
    21.  
    22. //$message = iconv("cp1251","KOI8-R",$message);
    23. //$message = "Content-Type: text/plain; charset=\"koi8-r\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n".$message;
    24.  
    25. //$subject=base64_encode(iconv("cp1251","KOI8-R",$subject));
    26. //$subject="=?KOI8-R?B?{$subject}?=";
    27. $message = str_replace("\n.", "\n..", $message);
    28.  
    29.  
    30.     try {
    31.        
    32.         // Создаем сокет
    33.         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    34.         if ($socket < 0) {
    35.             throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
    36.         }
    37.  
    38.         // Соединяем сокет к серверу
    39.         //echo 'Connect to \''.$address.':'.$port.'\' ... ';
    40.         $result = socket_connect($socket, $address, $port);
    41.         if ($result === false) {
    42.             throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
    43.         } else {
    44.           //  echo "OK\n";
    45.         }
    46.        
    47.         // Читаем информацию о сервере
    48.         read_smtp_answer($socket);
    49.        
    50.         // Приветствуем сервер
    51.         write_smtp_response($socket, 'EHLO '.$login);
    52.         read_smtp_answer($socket); // ответ сервера
    53.        
    54.         //echo 'Authentication ... ';
    55.            
    56.         // Делаем запрос авторизации
    57.         write_smtp_response($socket, 'AUTH LOGIN');
    58.         read_smtp_answer($socket); // ответ сервера
    59.        
    60.         // Отравляем логин
    61.         write_smtp_response($socket, base64_encode($login));
    62.         read_smtp_answer($socket); // ответ сервера
    63.        
    64.         // Отравляем пароль
    65.         write_smtp_response($socket, base64_encode($pwd));
    66.         read_smtp_answer($socket); // ответ сервера
    67.        
    68.         //echo "OK\n";
    69.         //echo "Check sender address ... ";
    70.        
    71.         // Задаем адрес отправителя
    72.         write_smtp_response($socket, 'MAIL FROM: <'.$from.'>', true);
    73.         read_smtp_answer($socket); // ответ сервера
    74.        
    75.        
    76.         //echo "OK\n";
    77.         //echo "Check recipient address ... ";
    78.        
    79.         // Задаем адрес получателя
    80.         write_smtp_response($socket, 'RCPT TO:<'.$to.'>');
    81.         read_smtp_answer($socket); // ответ сервера
    82.        
    83.         //echo "OK\n";
    84.         //echo "Send message text ... ";
    85.        
    86.         // Готовим сервер к приему данных
    87.         write_smtp_response($socket, 'DATA');
    88.         read_smtp_answer($socket); // ответ сервера
    89.        
    90.         // Отправляем данные
    91.         //$message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя"
    92.         //$message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения"
    93.        
    94.         $header  = 'MIME-Version: 1.0' . "\r\n";
    95.         $header .= 'Content-type: text/html; charset=UTF-8; '."\r\n";
    96.         $header .= "To: $to\r\n";
    97.         $header .= 'From: =?utf-8?b?' . base64_encode($from) . "?= <$from>\r\n";
    98.         $header .= "Subject: =?utf-8?b?".base64_encode($subject)."?=\r\n";
    99.         write_smtp_response($socket, $header.$message."\r\n.", true);
    100.        
    101.        
    102.        
    103.        
    104.         //write_smtp_response($socket, $message."\r\n.");
    105.         read_smtp_answer($socket); // ответ сервера
    106.        
    107.         //echo "OK\n";
    108.         echo '
    109.         Сообщение отправлено ... <br/>
    110.  
    111.         ';
    112.        
    113.         // Отсоединяемся от сервера
    114.         write_smtp_response($socket, 'QUIT');
    115.         read_smtp_answer($socket); // ответ сервера
    116.        
    117.   //      echo "OK\n";
    118.        
    119.     } catch (Exception $e) {
    120.         echo "\nError: ".$e->getMessage();
    121.     }
    122.    
    123.     if (isset($socket)) {
    124.         socket_close($socket);
    125.     }
    126.    
    127.     // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
    128.     function read_smtp_answer($socket) {
    129.         $read = socket_read($socket, 1024);
    130.        
    131.         if ($read{0} != '2' && $read{0} != '3') {
    132.             if (!empty($read)) {
    133.                 throw new Exception('SMTP failed: '.$read."\n");
    134.             } else {
    135.                 throw new Exception('Unknown error'."\n");
    136.             }
    137.         }
    138.     }
    139.    
    140.     // Функция для отправки запроса серверу
    141.     function write_smtp_response($socket, $msg) {
    142.         $msg = $msg."\r\n";
    143.         socket_write($socket, $msg, strlen($msg));
    144.     }
    145. ?>