Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   E-Mail (https://forum.antichat.xyz/forumdisplay.php?f=14)
-   -   PHP POP3 Interface [Proxy Support] (https://forum.antichat.xyz/showthread.php?t=169466)

CPU0 09.01.2010 16:53

PHP POP3 Interface [Proxy Support]
 
PHP POP3 Interface [Proxy Support]

Описание:
Набор функций для работы с POP3(RFC 1939).
Текущий список функций (будут дополняться по Вашим просьбам):
  • pop3_connect()
  • pop3_disconnect()
  • pop3_login()
  • pop3_stat()
  • pop3_list()
  • pop3_retr()
  • pop3_dele()
  • pop3_rset()
=====================================

Функция pop3_connect()
Устанавливает подключение с сервером и возвращает идентификатор соединения при успешном подключении. При ошибке возвращает FALSE
pop3_connect($host, $proxy=FALSE, $phost='', $pport='', $port='110', $timeout='20')
  • $host - адрес POP3-сервера
  • $proxy - использование Proxy-сервера при подключении (TRUE/FALSE)
  • $phost - IP-адрес Proxy-сервера
  • $pport - порт Proxy-сервера
  • $port - порт POP3-сервера
  • $timeout - таймаут соеденения
PHP код:

function pop3_connect($host$port='110'$proxy=FALSE$phost=''$pport=''$timeout='20')
{
    if(
$proxy)
    {
        
$patern_ip="^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$";
        
$patern_port="^([0-9]{2,5})$";
        if(
ereg($pattern_ip$phost) AND ereg($pattern_port$pport))
        {
            
$s=fsockopen("tcp://".$phost$pport);
            if(
$s)
            {
                
stream_set_timeout($s$timeout);
                
fputs($s"CONNECT $host:$port HTTP/1.0\r\n\r\n");
                
$line fread($s256);
                if(
eregi("200"$line))
                {
                    
fputs($s"NOOP\r\n");
                    
$line fread($s256);
                    if(
eregi("\+OK"$line))
                    {
                        return 
$s;
                    }
                } else {
                    return 
false;
                }
            } else {
                return 
false;
            }
        } else {
            return 
false;
        }
    } else {
        
$s=fsockopen($host$port);
        if(
$s)
        {
            
stream_set_timeout($s$timeout);
            
fputs($s"NOOP\r\n");
            
$line=fread($s256);
            if(
eregi("\+OK"$line))
            {
                return 
$s;
            } else {
                return 
false;
            }
        } else {
            return 
false;
        }
    }


Функция pop3_login()
Авторизует пользователя на POP3-сервере, при успешной авторизации возвращает TRUE, при ошибке возвращает FALSE
pop3_login($s, $login, $password)
  • $s - идентификатор соединения
  • $login - имя пользователя для авторизации
  • $password - пароль для авторизации
PHP код:

function pop3_login($s$login$password)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
            
fputs($s"USER $login\r\n");
            
$line=fread($s256);
            if(
eregi("\+OK"$line))
            {
                
fputs($s"PASS $password\r\n");
                
$line=fread($s256);
                if(
eregi("\+OK",$line))
                {
                    return 
true;
                } else {
                    return 
false;
                }
            } else {
                return 
false;
            }
        } else { 
            return 
false;
        }
    } else {
         return 
false;
    }


Функция pop3_disconnect()
Закрывает соединение с POP3-сервером, возвращает TRUE при успешном закрытии соединения,и FALSE при ошибке
pop3_disconnect($s)
  • $s - идентификатор соединения
PHP код:

function pop3_disconnect($s)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
                
fputs($s"QUIT\r\n");
                
$line fread($s256);
                if(
eregi("\+OK"$line))
                {
                    unset(
$s);
                    return 
true;
                } else {
                    return 
false;
                }                
        } else {
            return 
false;
        }
    } else {
        return 
false;
    }


Функция pop3_stat()
Возвращает массив, 1ый элемент которого - количество писем в ящике, 2ой - размер всех писем в байтах. Возвращает FALSE при ошибке
pop3_stat($s)
  • $s - идентификатор соединения
PHP код:

function pop3_stat($s)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
            
fputs($s"STAT\r\n");
            
$line fread($s256);
            if(
eregi("\+OK"$line))
            {
                
$reply=explode(" ",$line);
                return array(
$reply[1], $reply[2]);
            } else {
                return 
false;
            }
        } else { 
            return 
false;
        }
    } else {
         return 
false;
    }


Функция pop3_list()
Возвращает массив, ключи которого - идентификаторы писем, значения - размер письма. Возвращает FALSE при ошибке
pop3_list($s)
  • $s - идентификатор соединения
PHP код:

function pop3_list($s)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
                
fputs($s"LIST\r\n");
                while(!
feof($s)) { 
                    
$line.=fread($s256);
                    
$stream_meta_data=stream_get_meta_data($s);
                    if(
$stream_meta_data['unread_bytes']<=0) break;
                }
                if(
eregi("\+OK"$line))
                {
                    
preg_match_all('#([0-9]{1,})\s+([0-9]{3,10})#i'$line$reply);
                    unset(
$reply[0]);
                    
$result=array_combine($reply[1], $reply[2]);
                    
ksort($result);
                    return 
$result;
                } else {
                    return 
false;
                }
        } else { 
            return 
false;
        }
    } else {
         return 
false;
    }


Функция pop3_retr()
Возвращает полное содержание письма, по его идентификатору. Возвращает FALSE при ошибке
pop3_retr($s,$mid)
  • $s - идентификатор соединения
  • $mid - идентификатор письма
PHP код:

function pop3_retr($s,$mid)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
            
$mids=array_keys(pop3_list($s));
            if(
in_array($mid,$mids))
            {
                
fputs($s"RETR $mid\r\n");
                while(!
feof($s)) { 
                    
$line.=fread($s256);
                    
$stream_meta_data=stream_get_meta_data($s);
                    if(
$stream_meta_data['unread_bytes']<=0) break;
                }
                return 
$line;
            } else {
                return 
false;
            }
        } else { 
            return 
false;
        }
    } else {
         return 
false;
    }


Функция pop3_dele()
Удаляет письмо по его идентификатору, при успешном удалении возвращает TRUE, при ошибке возвращает FALSE
pop3_dele($s,$mid)
  • $s - идентификатор соединения
  • $mid - идентификатор письма
PHP код:

function pop3_dele($s,$mid)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
            
fputs($s"DELE $mid\r\n");
            
$line fread($s256);
            if(
eregi("\+OK"$line))
            {
                return 
true;
            } else {
                return 
false;
            }
        } else { 
            return 
false;
        }
    } else {
         return 
false;
    }


Функция pop3_rset()
Восстанавливает "удаленные письма" текущего соединения, при успешном восстановлении возвращает TRUE, при ошибке возвращает FALSE
pop3_rset($s)
  • $s - идентификатор соединения
PHP код:

function pop3_rset($s)
{
    if(
$s)
    {
        
fputs($s"NOOP\r\n");
        
$line fread($s256);
        if(
eregi("\+OK"$line))
        {
            
fputs($s"RSET\r\n");
            
$line fread($s256);
            if(
eregi("\+OK"$line))
            {
                return 
true;
            } else {
                return 
false;
            }
        } else {
            return 
false;
        }
    } else {
        return 
false;
    }


=====================================

В ближайшем времени (по приоритету):
  • функция обработки письма полученного с помощью pop3_retr()
  • функция скачивания всех писем с ящика
  • функция удаления всех писем
  • функция действий со списком e-mail`ов
  • функция "брутфорсер" :)
Скрипт(и последующие его версии) Вы можете скачать с сайта:
http://dmtn.ru/develop/pop3_interface/
Пример использования:
PHP код:

include('mail.php');
$s=pop3_connect('pop.yandex.ru');
if(
pop3_login($s'egorka@yandex.ru''preved'))
{
//действия при успешной авторизации
} else {
//ошибка авторизации
}
pop3_disconnect($s); 

Буду рад советам, пожеланиям, критике

CPU0 11.01.2010 04:40

11.01.2010
Добавлены функции:
# pop3_stat()
# pop3_list()
# pop3_retr()
# pop3_dele()
# pop3_rset()

shell_c0de 11.01.2010 06:24

залей куда нить готовый скрипт в одном архиве

CPU0 11.01.2010 16:46

Цитата:

Сообщение от shell_c0de
залей куда нить готовый скрипт в одном архиве

http://dmtn.ru/develop/pop3_interface/0.1b/mail.zip

maximka555 13.01.2010 16:15

Цитата:

Сообщение от CPU0
http://dmtn.ru/develop/pop3_interface/0.1b/mail.zip

error404

CPU0 13.01.2010 18:03

Цитата:

Сообщение от maximka555
error404

Вообщето 403.
Вечером восстановлю.

CPU0 03.02.2010 04:00

Данный топик интересен кому-либо из присутствующих?
Если нет - не вижу смысла продолжать разработку.

Kusto 03.02.2010 10:40

Цитата:

Сообщение от CPU0
Данный топик интересен кому-либо из присутствующих?
Если нет - не вижу смысла продолжать разработку.

продолжай конечно, кому надо- тому интересно, просто невсякий знает как довести до ума данные функции (кстати какие еще наработки планируеш?)

Alexander89 28.02.2010 22:20

Цитата:

$logined = pop3_login($s, $user, $pass);
if($logined===FALSE){exit("pop3_login error");}
Все время pop3_login error

добавлено через 5 мин
NOOP -ERR Invalid command.


спусия еще 10 мин
почикал везде
PHP код:

        fputs($s"NOOP\r\n"); 
        
$line fread($s256); 
        if(
eregi("\+OK"$line)) 
        { 

PHP код:

        } else {  
            return 
false
        } 

Теперь виснет на
pop3_retr()

спусия еще 10 мин
Для получения ответа от сервера использую
PHP код:

function get_data($pop_conn){
    
$data="";
    while (!
feof($pop_conn)) {
        
$buffer chop(fgets($pop_conn,1024));
        
$data .= "$buffer\r\n";
        if(
trim($buffer) == "."){ break;}
    }
    return 
$data;


Так скрипт не виснет!

Alexander89 28.02.2010 23:32

Вот что получилось после моего шаманства
Файл func.php
PHP код:

<?php
 
function pop3_connect($host$port='110'$proxy=FALSE$phost=''$pport=''$timeout='20'

    if(
$proxy
    { 
        
$patern_ip="^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$"
        
$patern_port="^([0-9]{2,5})$"
        if(
ereg($pattern_ip$phost) AND ereg($pattern_port$pport)) 
        { 
            
$s=fsockopen("tcp://".$phost$pport); 
            if(
$s
            { 
                
stream_set_timeout($s$timeout); 
                
fputs($s"CONNECT $host:$port HTTP/1.0\r\n\r\n"); 
                
$line fread($s256); 
                if(
eregi("200"$line)) 
                { 
                    
fputs($s"NOOP\r\n"); 
                    
$line fread($s256); 
                    if(
eregi("\+OK"$line)) 
                    { 
                        return 
$s
                    } 
                } else { 
                    return 
false
                } 
            } else { 
                return 
false
            } 
        } else { 
            return 
false
        } 
    } else { 
        
$s=fsockopen($host$port$errno$errstr$timeout); 
        if(
$s
        {
            
$line=fgets($s,1024);            
            
stream_set_timeout($s$timeout);
            return 
$s;             
        } else { 
            return 
false
        } 
    } 




 function 
pop3_login($s$login$password

    if(
$s
    { 
            
fputs($s"USER $login\r\n"); 
            
$line=fread($s256);
            
//echo  "USER $login\r\n";
            //echo  $line;
            
if(eregi("\+OK"$line)) 
            { 
                
fputs($s"PASS $password\r\n"); 
                
$line=fread($s256); 
                
//echo "PASS $password\r\n";
                //echo $line;
                
if(eregi("\+OK",$line)) 
                { 
                    return 
true
                } else { 
                    return 
false
                } 
            } else { 
                return 
false
            } 
    } else { 
         return 
false
    } 



 function 
pop3_disconnect($s

    if(
$s
    { 
                
fputs($s"QUIT\r\n"); 
                
$line fread($s256); 
                if(
eregi("\+OK"$line)) 
                { 
                    unset(
$s); 
                    return 
true
                } else { 
                    return 
false
                }                 
    } else { 
        return 
false
    } 


 function 
pop3_stat($s

    if(
$s
    { 
            
fputs($s"STAT\r\n"); 
            
$line fread($s256); 
            if(
eregi("\+OK"$line)) 
            { 
                
$reply=explode(" ",$line); 
                return array(
$reply[1], $reply[2]); 
            } else { 
                return 
false
            } 
    } else { 
         return 
false
    } 



//Возвращает массив, ключи которого - идентификаторы писем, значения - размер письма. Возвращает FALSE при ошибке
//$s - идентификатор соединения
 
function pop3_list($s

    if(
$s
    { 
                
fputs($s"LIST\r\n"); 
                while(!
feof($s)) {  
                    
$line.=fread($s256); 
                    
$stream_meta_data=stream_get_meta_data($s); 
                    if(
$stream_meta_data['unread_bytes']<=0) break; 
                }
                
//echo  "LIST\r\n";                
                //echo  "$line\r\n";                
                
if(eregi("\+OK"$line)) 
                { 
                    
preg_match_all('#([0-9]{1,})\s+([0-9]{3,10})#i'$line$reply); 
                    unset(
$reply[0]); 
                    
$result=array_combine($reply[1], $reply[2]); 
                    
ksort($result); 
                    return 
$result
                } else { 
                    return 
false
                } 
    } else { 
         return 
false
    } 




//Возвращает полное содержание письма, по его идентификатору. Возвращает FALSE при ошибке
function pop3_retr($s,$mid){ 
    if(
$s === FALSE){
        return 
false
    }
    
    
fputs($s"RETR $mid\r\n"); 
    return 
get_data($s);




//Удаляет письмо по его идентификатору, при успешном удалении возвращает TRUE, при ошибке возвращает FALSE
//$s - идентификатор соединения
//$mid - идентификатор письма
 
function pop3_dele($s,$mid

    if(
$s
    { 
            
fputs($s"DELE $mid\r\n"); 
            
$line fread($s256); 
            if(
eregi("\+OK"$line)) 
            { 
                return 
true
            } else { 
                return 
false
            } 

    } else { 
         return 
false
    } 
}


//Восстанавливает "удаленные письма" текущего соединения, при успешном восстановлении возвращает TRUE, при ошибке возвращает FALSE
 
function pop3_rset($s

    if(
$s
    { 
            
fputs($s"RSET\r\n"); 
            
$line fread($s256); 
            if(
eregi("\+OK"$line)) 
            { 
                return 
true
            } else { 
                return 
false
            } 
    } else { 
        return 
false
    } 
}


function 
get_data($pop_conn){
    
$data="";
    while (!
feof($pop_conn)) {
        
$buffer chop(fgets($pop_conn,1024));
        
$data .= "$buffer\r\n";
        if(
trim($buffer) == "."){ break;}
    }
    return 
$data;

?>




Ну и пример использования
PHP код:

<?php
include('func.php');


$host    'site.ru'
$proxy    FALSE;
$phost    '';
$pport    '';
$port    110;
$timeout10;
$user    'username';
$pass    'password';
 


$s    pop3_connect($host$port$proxy=FALSE$phost$pport$timeout); 
if(
$s===FALSE){exit("\r\npop3_connect error\r\n");}

    

$logined pop3_login($s$user$pass);
if(
$logined===FALSE){exit("\r\npop3_login error\r\n");}



$list     pop3_list($s);
if(
$list===FALSE){exit("pop3_list error");}

foreach(
$list as $mid => $msize){

    
$mtext pop3_retr($s,$mid);
    
//pop3_dele($s,$mid);
    
    
    
echo "<br />\r\n------------------------------------------------------\r\n<br />";
    echo 
str_replace("\r\n""<br />",$mtext);
    echo 
"<br />\r\n------------------------------------------------------\r\n<br />";
}


pop3_disconnect($s); 
?>



Время: 05:29