IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Почта через socket на PHP (http://www.imho.ws/showthread.php?t=88589)

Naked 04.07.2005 17:40

Почта через socket на PHP
 
Народ, как отправить почту с другого сервера через сокеты и реализовать это на 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 позволяет отправлять почту напрямую через 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

Цитата:

Сообщение от The_naked
в твой скрипт

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

Цитата:

Сообщение от BorLase
отлови сессию любого почтовика с сервером и сдублируй

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

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?
Сначала посылаем логин, а потом пароль.

Цитата:

как перевести в base64
www.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:


Часовой пояс GMT +4, время: 07:36.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.