Здравствуйте. Использую такой скрипт для отправки почты через smtp с авторизацией. Все хорошо, русские символы перекодировал. Но вот отправитель всегда пишется "От кого MAILER-DAEMON". Может какой новый стандарт, нужно закодировать или преобразовать кодировку для этого поля? Может кто помочь Код (Text): <? echo $pass; error_reporting(E_ALL ^ E_WARNING); ob_implicit_flush(); $address = 'mail.*.ru'; // адрес smtp-сервера $port = 25; // порт (стандартный smtp - 25) $login = ''; // логин к ящику $pwd = ''; // пароль к ящику $from = 'webmaster@*.ru'; // адрес отправителя $to =$email_p1; // адрес получателя $subject = '0101010'; // тема сообщения $message = ' Здравствуйте. Пароль для системы: '.$pass.' По вопросам системы обращайтесь'; // текст сообщения $message = iconv("cp1251","KOI8-R",$message); $message = "Content-Type: text/plain; charset=\"koi8-r\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n".$message; $subject=base64_encode(iconv("cp1251","KOI8-R",$subject)); $subject="=?KOI8-R?B?{$subject}?="; try { // Создаем сокет $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n"); } // Соединяем сокет к серверу echo 'Connect to \''.$address.':'.$port.'\' ... '; $result = socket_connect($socket, $address, $port); if ($result === false) { throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n"); } else { echo "OK\n"; } // Читаем информацию о сервере read_smtp_answer($socket); // Приветствуем сервер write_smtp_response($socket, 'EHLO '.$login); read_smtp_answer($socket); // ответ сервера echo 'Authentication ... '; // Делаем запрос авторизации write_smtp_response($socket, 'AUTH LOGIN'); read_smtp_answer($socket); // ответ сервера // Отравляем логин write_smtp_response($socket, base64_encode($login)); read_smtp_answer($socket); // ответ сервера // Отравляем пароль write_smtp_response($socket, base64_encode($pwd)); read_smtp_answer($socket); // ответ сервера echo "OK\n"; echo "Check sender address ... "; // Задаем адрес отправителя write_smtp_response($socket, 'MAIL FROM: <'.$from.'>'); read_smtp_answer($socket); // ответ сервера echo "OK\n"; echo "Check recipient address ... "; // Задаем адрес получателя write_smtp_response($socket, 'RCPT TO:<'.$to.'>'); read_smtp_answer($socket); // ответ сервера echo "OK\n"; echo "Send message text ... "; // Готовим сервер к приему данных write_smtp_response($socket, 'DATA'); read_smtp_answer($socket); // ответ сервера // Отправляем данные $message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя" $message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения" write_smtp_response($socket, $message."\r\n."); read_smtp_answer($socket); // ответ сервера echo "OK\n"; echo 'Close connection ... '; // Отсоединяемся от сервера write_smtp_response($socket, 'QUIT'); read_smtp_answer($socket); // ответ сервера echo "OK\n"; } catch (Exception $e) { echo "\nError: ".$e->getMessage(); } if (isset($socket)) { socket_close($socket); } // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки function read_smtp_answer($socket) { $read = socket_read($socket, 1024); if ($read{0} != '2' && $read{0} != '3') { if (!empty($read)) { throw new Exception('SMTP failed: '.$read."\n"); } else { throw new Exception('Unknown error'."\n"); } } } // Функция для отправки запроса серверу function write_smtp_response($socket, $msg) { $msg = $msg."\r\n"; socket_write($socket, $msg, strlen($msg)); } ?>
Стоит почтовый сервер свой. сервер вэб, он умеет отправлять только через smtp для того чтобы не попали в черные списки провайдеров майла яндекса и т.д. В общем проще разобраться со скриптом чем с серверами. Все cms до этого справлялись с этой функцией... а вот самописный, столкнулся с проблемами
mailmoney он умеет отправлять только через smtp для того чтобы не попали в черные списки провайдеров майла яндекса и т.д. это какой-то новый городской миф?
Разобрался. Вот код верный. PHP: <? //echo $pass; error_reporting(E_ALL ^ E_WARNING); ob_implicit_flush(); $address = 'mail.*.ru'; // адрес smtp-сервера $port = 25; // порт (стандартный smtp - 25) $login = ''; // логин к ящику $pwd = ''; // пароль к ящику $from = 'webmaster@*.ru'; // адрес отправителя $to =$email_p1; // адрес получателя $subject = 'Пароль для системы'; // тема сообщения $message = ' Здравствуйте. <br/> Пароль для системы: '.$pass.' <br/> По вопросам системы обращайтесь в '; // текст сообщения //$message = iconv("cp1251","KOI8-R",$message); //$message = "Content-Type: text/plain; charset=\"koi8-r\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n".$message; //$subject=base64_encode(iconv("cp1251","KOI8-R",$subject)); //$subject="=?KOI8-R?B?{$subject}?="; $message = str_replace("\n.", "\n..", $message); try { // Создаем сокет $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n"); } // Соединяем сокет к серверу //echo 'Connect to \''.$address.':'.$port.'\' ... '; $result = socket_connect($socket, $address, $port); if ($result === false) { throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n"); } else { // echo "OK\n"; } // Читаем информацию о сервере read_smtp_answer($socket); // Приветствуем сервер write_smtp_response($socket, 'EHLO '.$login); read_smtp_answer($socket); // ответ сервера //echo 'Authentication ... '; // Делаем запрос авторизации write_smtp_response($socket, 'AUTH LOGIN'); read_smtp_answer($socket); // ответ сервера // Отравляем логин write_smtp_response($socket, base64_encode($login)); read_smtp_answer($socket); // ответ сервера // Отравляем пароль write_smtp_response($socket, base64_encode($pwd)); read_smtp_answer($socket); // ответ сервера //echo "OK\n"; //echo "Check sender address ... "; // Задаем адрес отправителя write_smtp_response($socket, 'MAIL FROM: <'.$from.'>', true); read_smtp_answer($socket); // ответ сервера //echo "OK\n"; //echo "Check recipient address ... "; // Задаем адрес получателя write_smtp_response($socket, 'RCPT TO:<'.$to.'>'); read_smtp_answer($socket); // ответ сервера //echo "OK\n"; //echo "Send message text ... "; // Готовим сервер к приему данных write_smtp_response($socket, 'DATA'); read_smtp_answer($socket); // ответ сервера // Отправляем данные //$message = "To: $to\r\n".$message; // добавляем заголовок сообщения "адрес получателя" //$message = "Subject: $subject\r\n".$message; // заголовок "тема сообщения" $header = 'MIME-Version: 1.0' . "\r\n"; $header .= 'Content-type: text/html; charset=UTF-8; '."\r\n"; $header .= "To: $to\r\n"; $header .= 'From: =?utf-8?b?' . base64_encode($from) . "?= <$from>\r\n"; $header .= "Subject: =?utf-8?b?".base64_encode($subject)."?=\r\n"; write_smtp_response($socket, $header.$message."\r\n.", true); //write_smtp_response($socket, $message."\r\n."); read_smtp_answer($socket); // ответ сервера //echo "OK\n"; echo ' Сообщение отправлено ... <br/> '; // Отсоединяемся от сервера write_smtp_response($socket, 'QUIT'); read_smtp_answer($socket); // ответ сервера // echo "OK\n"; } catch (Exception $e) { echo "\nError: ".$e->getMessage(); } if (isset($socket)) { socket_close($socket); } // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки function read_smtp_answer($socket) { $read = socket_read($socket, 1024); if ($read{0} != '2' && $read{0} != '3') { if (!empty($read)) { throw new Exception('SMTP failed: '.$read."\n"); } else { throw new Exception('Unknown error'."\n"); } } } // Функция для отправки запроса серверу function write_smtp_response($socket, $msg) { $msg = $msg."\r\n"; socket_write($socket, $msg, strlen($msg)); } ?>