Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Использование imap, pop, smtp через socks


Автор: Chodex 7.1.2010, 12:07
Собственно, нужно работать с pop, imap, smtp через соксы. 
перерыл множество классов и расширений PEAR, ничего не нашел подобного...

Возможно ли? Использовал кто-нибудь?

Автор: solenko 7.1.2010, 12:13
А в мануал заглядывали? )
http://php.net/manual/en/book.imap.php

Автор: Chodex 7.1.2010, 12:26
Заглядывал, но что-то ни одного упоминания не встретил :( 
Стоит поподробнее рассмотреть? Или это догадка была?

Может быть есть готовая реализация на других скриптовых языках?

Автор: solenko 7.1.2010, 12:53
Догадка. Вернее я невнимательно прочитал вопрос. Но!
imap_open открывает straem. Т.к. самой функции нельзя указать контекст, то она должна исползовать default context. Соответственно, его можно настроить на использование proxy. Т.е. попробуйте заглянуть еще и сюда: http://www.php.net/manual/en/book.stream.php

Автор: Reverent 23.1.2010, 18:06
Вот тебе код, как отправить через сокеты, с помощью SMTP почту.

Код

class Mail
{
public $ADDRESS;
public $PORT;
public $LOGIN;
public $PASSWORD;
public $SOCKET;

    
    
    function __construct($address, $login, $password, $port = 25)
    {
    $this->ADDRESS = $address;
    $this->PORT = $port;
    $this->LOGIN = $login;
    $this->PASSWORD = $password;
    }
    
    
    
    
    public function send($to, $subject, $message, $from = "")
    {
    $this->SOCKET = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
        if ($this->SOCKET < 0)
        {
        $this->error('socket_create() failed: '.socket_strerror(socket_last_error()));
        }
        
    $result = socket_connect($this->SOCKET, $this->ADDRESS, $this->PORT);
    
        if ($result === false)
        {
        $this->error('socket_connect() failed: '.socket_strerror(socket_last_error()));
        }
    
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'EHLO '.$this->ADDRESS);
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'AUTH LOGIN');
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, base64_encode($this->LOGIN));
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, base64_encode($this->PASSWORD));
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'MAIL FROM:<'.$from.'>');
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'RCPT TO:<'.$to.'>');
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'DATA');
    $this->read_smtp_answer($this->SOCKET);
    
    $message = "To: $to\r\nSubject: $subject\r\nContent-type: text/html; charset=windows-1251\r\n".$message;
    $this->write_smtp_response($this->SOCKET, $message."\r\n.");
    $this->read_smtp_answer($this->SOCKET);
    
    $this->write_smtp_response($this->SOCKET, 'QUIT');
    $this->read_smtp_answer($this->SOCKET);
    }
    
    
    
    
    protected function error($mes)
    {
    echo $mes;
    exit;
    }
    
    
    
    
    protected function read_smtp_answer($socket)
    {
    $read = socket_read($socket, 1024);
       
        if ($read{0} != '2' && $read{0} != '3')
        {
            if(!empty($read))
            {
            $this->error('SMTP failed: '.$read."\n");
            }
            else
            {
            $this->error('Unknown error'."\n");
            }
        }
    }
    
    
    
    
    protected function write_smtp_response($socket, $msg)
    {
    $msg = $msg."\r\n";
    socket_write($socket, $msg, strlen($msg));
    }
    
    
    
    function __destruct()
    {
    socket_close($this->SOCKET);
    }
}


Может сможешь выделить с него и другие функции ;)!

Автор: Ипатьев 23.1.2010, 18:14
Reverent, к сожалению, вы не поняли вопроса
про сокеты  речи не было

Автор: Resident 16.12.2010, 16:38
Тоже интересует вопрос. Вроде такое можно сделать через cURL, но как непонятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)