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() Устанавливает подключение с сервером и возвращает идентификатор соединения при успешном подключении. При ошибке возвращает FALSEpop3_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($s, 256); if(eregi("200", $line)) { fputs($s, "NOOP\r\n"); $line = fread($s, 256); 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($s, 256); if(eregi("\+OK", $line)) { return $s; } else { return false; } } else { return false; } } } Функция pop3_login() Авторизует пользователя на POP3-сервере, при успешной авторизации возвращает TRUE, при ошибке возвращает FALSEpop3_login($s, $login, $password) $s - идентификатор соединения $login - имя пользователя для авторизации $password - пароль для авторизации PHP: function pop3_login($s, $login, $password) { if($s) { fputs($s, "NOOP\r\n"); $line = fread($s, 256); if(eregi("\+OK", $line)) { fputs($s, "USER $login\r\n"); $line=fread($s, 256); if(eregi("\+OK", $line)) { fputs($s, "PASS $password\r\n"); $line=fread($s, 256); 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($s, 256); if(eregi("\+OK", $line)) { fputs($s, "QUIT\r\n"); $line = fread($s, 256); 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($s, 256); if(eregi("\+OK", $line)) { fputs($s, "STAT\r\n"); $line = fread($s, 256); 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($s, 256); if(eregi("\+OK", $line)) { fputs($s, "LIST\r\n"); while(!feof($s)) { $line.=fread($s, 256); $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($s, 256); 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($s, 256); $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, при ошибке возвращает FALSEpop3_dele($s,$mid) $s - идентификатор соединения $mid - идентификатор письма PHP: function pop3_dele($s,$mid) { if($s) { fputs($s, "NOOP\r\n"); $line = fread($s, 256); if(eregi("\+OK", $line)) { fputs($s, "DELE $mid\r\n"); $line = fread($s, 256); if(eregi("\+OK", $line)) { return true; } else { return false; } } else { return false; } } else { return false; } } Функция pop3_rset() Восстанавливает "удаленные письма" текущего соединения, при успешном восстановлении возвращает TRUE, при ошибке возвращает FALSEpop3_rset($s) $s - идентификатор соединения PHP: function pop3_rset($s) { if($s) { fputs($s, "NOOP\r\n"); $line = fread($s, 256); if(eregi("\+OK", $line)) { fputs($s, "RSET\r\n"); $line = fread($s, 256); 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, '[email protected]', 'preved')) { //действия при успешной авторизации } else { //ошибка авторизации } pop3_disconnect($s); Буду рад советам, пожеланиям, критике
продолжай конечно, кому надо- тому интересно, просто невсякий знает как довести до ума данные функции (кстати какие еще наработки планируеш?)
Все время pop3_login error добавлено через 5 мин NOOP -ERR Invalid command. спусия еще 10 мин почикал везде PHP: fputs($s, "NOOP\r\n"); $line = fread($s, 256); 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; } Так скрипт не виснет!
Вот что получилось после моего шаманства Файл 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($s, 256); if(eregi("200", $line)) { fputs($s, "NOOP\r\n"); $line = fread($s, 256); 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($s, 256); //echo "USER $login\r\n"; //echo $line; if(eregi("\+OK", $line)) { fputs($s, "PASS $password\r\n"); $line=fread($s, 256); //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($s, 256); 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($s, 256); 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($s, 256); $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($s, 256); 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($s, 256); 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; $timeout= 10; $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); ?>