SMTP отправка писем своими руками
Ранее мы рассмотрели метод отправки почты посредством PHP-функции mail(). Не все провайдеры дают отправлять почту, а если и дают, то действуют какие-то ограничения. Но мы же не ищем легких путей, будем делать обходной путь, а именно отсылку почты через SMTP.
Пропустим описание протокола SMTP, сразу приступим к практике. Рассматривать будем пример именно с аутентификацией на сервере почты. Для примера специально создал ящик на яндексе, чтобы Вы сами могли попробовать и посмотреть результат или же создайте свой ящик и пробуйте, пробуйте, пробуйте...
Для всёго этого дела нам понадобятся функции для работы с сокетами (хмммм хотя и сокеты могут быть отключены у хостера, но тут уж ничего не поделаешь, придется менять хостера).
Для работы нам понадобится 4 функции: socket_create - создание сокета; socket_connect - соединение с сервером; socket_write - запись в поток данных;socket_close - закрытие сокета. Можно еще использовать пятую функцию socket_read для логирования ответов сервера, но это нам сейчас не нужно.
<?
// Функция для отправки запроса серверу
function smtpCommand($socket, $msg) {
socket_write($socket, $msg."\r\n", strlen($msg."\r\n"));
}
$server = "smtp.yandex.ru";
$port = 25;
$login = "script.php";
$pass = "123qwe";
$from = "script.php@yandex.ru";
$to = "script.php@yandex.ru";
$subject = "Тема письма";
$message = "Текст письма";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $server, $port);
if ($result === false)
die("Невозможно соединиться с {$server}:{$port}");
smtpCommand($socket, "EHLO ".$server); // Посылаем на сервер, что будет аутентификация по логину и паролю
smtpCommand($socket, "AUTH LOGIN"); // передаем команду ввода логина и пароля
smtpCommand($socket, base64_encode($login)); // логин, надо кодировать в BASE64
smtpCommand($socket, base64_encode($pass)); // пароль, надо кодировать в BASE64
smtpCommand($socket, "MAIL FROM: <{$from}>"); // указываем значение поля "От кого"
smtpCommand($socket, "RCPT TO: <{$to}>"); // указываем значение поля "Кому"
smtpCommand($socket, "DATA"); // говорим серверу, что будет сообщение письма
smtpCommand($socket, "Subject: {$subject}\r\nTo: {$to}\r\n{$message}\r\n."); // добавляем тело письма
smtpCommand($socket, "QUIT"); // Собственно отправляем письмо и выходим
socket_close($socket);
?>
В принципе все строки прокомментированы, если есть вопросы, то задавайте.
