PDA

Просмотр полной версии : Почта через socket на PHP


Naked
04.07.2005, 17:40
Народ, как отправить почту с другого сервера через сокеты и реализовать это на PHP? :молись:

RaZEr
04.07.2005, 17:48
отправить почту с другого сервераЧто это означает? Послать письмо через соксовый прокси или что?

Naked
04.07.2005, 17:51
Есть сервер, но на нем не стоит почтовый клиент, нужно открыть socket соединение с почтовым сервером и отправить почту, как я понимаю, только я не знаю, как это делается...:(

BorLase
04.07.2005, 18:17
погоди... может, какая-то хитрая постановка задачи - но в функции мейл есть параметры "адрес мейл-сервера", "порт" и тд - что не дает указать параметры почтового сервера?

Naked
04.07.2005, 18:25
нет, нужно именно через сокет:)

Naked
04.07.2005, 19:47
Причем в mail() нет параметра "адрес мейл-сервера" и "порт"... :confused:

RaZEr
04.07.2005, 19:52
function send($server, $to, $from, $subject="", $headers="") {

$headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs($fp,"MAIL FROM: $from\n");
fputs($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs($fp,$this->headers);
if (strlen($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n");
while(!feof($fp))
$resp.=fgets($fp,1024);
fclose($fp);
} PS: не проверял.

Saruman
04.07.2005, 19:57
PEAR Mail (http://pear.php.net/package/Mail) позволяет отправлять почту напрямую через smtp

BorLase
05.07.2005, 10:30
в общем, смотри тут: http://ru.php.net/mail - особенно обрати внимание на комменты ниже статьи хелпа

честно говоря, не вижу ни единого резона слать почту через сокеты вместо обычного процессинга.

RaZEr
05.07.2005, 13:52
А что есть "обычный процессинг"? ... те же сокеты.

BorLase
05.07.2005, 14:00
я имел в виду использовать mail вместо прямой коммуникации с портом :)

RaZEr
05.07.2005, 14:09
Я понял. Просто есть немало причин отказаться от mail() ... например невозможность задать таймаут на отправку.

Naked
05.07.2005, 15:58
RaZEr
А если на почтовике нужна авторизация, то что нужно добавить в твой скрипт? :молись:

BorLase
05.07.2005, 16:08
Если тебе так уж необходимо опуститься на столь низкий уровень - поставь сниффер, отлови сессию любого почтовика с сервером и сдублируй

дешево и сердито :)

RaZEr
05.07.2005, 16:18
в твой скриптСкрипт не мой. Добавить нужно отправку комманды AUTH. В зависимости от способа авторизации. Например "AUTH LOGIN". Далее нужно послать сначала логин, а потом пароль. Подробнее в RFC - http://www.faqs.org/rfcs/rfc2554.html

отлови сессию любого почтовика с сервером и сдублируйНа анализе снифа нормального интерфейса не напишешь. Нужно читать ман и знать что сервер хочет, и что может вернуть.

BorLase
05.07.2005, 16:20
RaZEr:
На анализе снифа нормального интерфейса не напишешь. Нужно читать ман и знать что сервер хочет, и что может вернуть.
одно другому не помеха ;)

"Решая задачу, всегда полезно знать ответ заранее" ;)

Naked
05.07.2005, 17:56
<?
include("Mail.php");

$recipients = "mail_to@domain.mail";

$headers["From"] = "mail_from@domain.mail";
$headers["To"] = "mail_to@domain.mail";
$headers["Subject"] = "Test message";

$body = "TEST MESSAGE!!!";

$params["host"] = "smtp.server";
$params["port"] = "25";
$params["auth"] = true;
$params["username"] = "user";
$params["password"] = "password";

// Create the mail object using the Mail::factory method
$mail_object =& Mail::factory("smtp", $params);

$mail_object->send($recipients, $headers, $body);
?>

Я вот такой скрипт достал, только не понимаю, я Mail.php и pear.php положил, а он говорит
Call to undefined function: send()
что может быть не так? :idontnow:

Saruman
05.07.2005, 19:02
Проверь, возвращает ли factory() ошибку или нужный объект.

if (PEAR::isError($mail_object)) {
die($mail_object->getMessage());
}

Naked
06.07.2005, 17:40
Вот незадача, узнал, что на серваке нет этого PEAR:( кто все-таки подскажет как через сокиты только с авторизацией. Можно не код, а что отсылать серверу, а именно как отсылать AUTH? :help: :молись:

RaZEr
06.07.2005, 17:47
Я кажется всё сказал. Посылаешь AUTH LOGIN, затем логин (в Base64) и далее пароль (тоже в base64).

Naked
06.07.2005, 17:56
А логин и пароль чем-то должны быть разделены или \n? И еще тогда вопросик, как перевести в base64 (желательно на PHP) :help:

RaZEr
06.07.2005, 18:02
А логин и пароль чем-то должны быть разделены или \n?Сначала посылаем логин, а потом пароль.

как перевести в base64www.php.net/base64_encode

Naked
06.07.2005, 18:34
Ура, написал скрипт, вроде даже работает, только на той машине на которой нужно пишет
fsockopen(): php_network_getaddresses: getaddrinfo failed: hostname nor servname provided, or not known ...
не знаете из-за чего может быть?

RaZEr
06.07.2005, 19:19
Соединяйся по IP.

Naked
06.07.2005, 20:06
Да, действительно, по IP получается :yees: