Отправка писем PHP

12
Ruslan203
На сайте с 23.03.2006
Offline
99
2015

Вообщем не работает отправка писем через пхп

Нашел в инете скриптик для проверки:

<?php

header('Content-Type: text/plain;');
error_reporting(E_ALL ^ E_WARNING);
ob_implicit_flush();

$address = 'адрес сервера'; // адрес smtp-сервера
$port = 25; // порт (стандартный smtp - 25)

$login = 'логин'; // логин к ящику
$pwd = 'пароль'; // пароль к ящику

$from = 'откуда'; // адрес отправителя
$to = 'куда'; // адрес получателя

$subject = 'Message subject'; // тема сообщения
$message = 'Message text'; // текст сообщения

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

В итоге выдает ошибку:

Connect to 'сервер:25' ... OK

Authentication ...

Error: SMTP failed: 503 5.5.1 Error: authentication not enabled

Как включить эту авторизацию?

Создание, продвижение сайтов (http://www.gendesign.ru) +7 (495) 5072151, icq: 915-109
yoda-master
На сайте с 21.04.2009
Offline
33
#1

По всей видимости проблема в СМТП сервере к которому вы подключаетесь.

После трех дней без программирование жизнь становится бессмысленной....
Ruslan203
На сайте с 23.03.2006
Offline
99
#2
yoda-master:
По всей видимости проблема в СМТП сервере к которому вы подключаетесь.

Может в скрипте надо включить "param auth true" ?

doctorpc
На сайте с 12.07.2009
Offline
112
#3

Думаю, проблема в том, что сервер требует SSL аутентификацию.

Она включается командой STARTTLS,


write_smtp_response($socket, 'STARTTLS');
read_smtp_answer($socket); // ответ сервера

но после этого все последующие команды должны быть зашифрованы.

Поэтому, скорее всего скрипт через сокеты не будет работать. Или я незнаю как шифровровать команды.

Что если просто в Вашем изначальном скрипте включить ssl аутентификацию? С помощью чего Вы изначально хотели посылать email? Какой функцией?

IL
На сайте с 20.04.2007
Offline
435
#4
Ruslan203:
Error: SMTP failed: 503 5.5.1 Error: authentication not enabled
Как включить эту авторизацию?

А если её не использовать? Убрать строки с отправкой команд логина и пароля.

write_smtp_response($socket, 'AUTH LOGIN');
..
echo "OK\n";
echo "Check sender address ... ";
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
M2
На сайте с 11.01.2011
Offline
342
#5

А зачем вы через SMTP шлёте? Отправляйте с помощью функции mail() и всё.

------------------- Крутые VPS и дедики. Качество по разумной цене ( http://cp.inferno.name/view.php?product=1212&gid=1 ) VPS25OFF - скидка 25% на первый платеж по ссылке выше
Ruslan203
На сайте с 23.03.2006
Offline
99
#6

Authentication ...

Error: SMTP failed: 502 5.5.2 Error: command not recognized

---------- Добавлено 19.03.2013 в 21:40 ----------

mark2011:
А зачем вы через SMTP шлёте? Отправляйте с помощью функции mail() и всё.

Система управления такая ....

doctorpc
На сайте с 12.07.2009
Offline
112
#7

Вот пример отправки с исползованием PEAP Mail с включенным ssl шифрованием.


<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <recipient@example.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "ssl://mail.example.com";
$port = "465";
$username = "smtp_username";
$password = "smtp_password";

$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port,
'auth' => true,
'username' => $username,
'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
} else {
echo("<p>Message successfully sent!</p>");
}
?>
Ruslan203
На сайте с 23.03.2006
Offline
99
#8

Нету на сервере PEAP Mail

doctorpc:
Вот пример отправки с исползованием PEAP Mail с включенным ssl шифрованием.


<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <recipient@example.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "ssl://mail.example.com";
$port = "465";
$username = "smtp_username";
$password = "smtp_password";

$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port,
'auth' => true,
'username' => $username,
'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
} else {
echo("<p>Message successfully sent!</p>");
}
?>
M2
На сайте с 11.01.2011
Offline
342
#9

Ruslan203,

У вас виртуальный хостинг или VPS? Если виртуалка, SMTP скорее всего localhost будет, узнать можно стандартным выводом phpinfo() (хотя не факт что хостер там не пропишет муляжное значение). Если VPS - можно же установить SMTP и не париться.

Ruslan203
На сайте с 23.03.2006
Offline
99
#10
mark2011:
Ruslan203,
У вас виртуальный хостинг или VPS? Если виртуалка, SMTP скорее всего localhost будет, узнать можно стандартным выводом phpinfo() (хотя не факт что хостер там не пропишет муляжное значение). Если VPS - можно же установить SMTP и не париться.

Там выделенный сервер, на котором нету смтп и по ходу дела его туда поставить нельзя, нужно отправлять письма через сторонний сервер, просто отправка писем работает, а вот через php нет... В этом я и хочу разобраться почему не отправляется...

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий