PDA

Просмотр полной версии : PHP POP3 Interface [Proxy Support]


CPU0
09.01.2010, 16:53
PHP POP3 Interface [Proxy Support]

Описание:
Набор функций для работы с POP3(RFC 1939 (http://www.ietf.org/rfc/rfc1939.txt)).
Текущий список функций (будут дополняться по Вашим просьбам):


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 - таймаут соеденения


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, при ошибке возвращает FALSE
pop3_login($s, $login, $password)

$s - идентификатор соединения
$login - имя пользователя для авторизации
$password - пароль для авторизации

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 - идентификатор соединения

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 - идентификатор соединения

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 - идентификатор соединения

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 - идентификатор письма

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, при ошибке возвращает FALSE
pop3_dele($s,$mid)

$s - идентификатор соединения
$mid - идентификатор письма

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, при ошибке возвращает FALSE
pop3_rset($s)

$s - идентификатор соединения

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/

Пример использования:
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
залей куда нить готовый скрипт в одном архиве
http://dmtn.ru/develop/pop3_interface/0.1b/mail.zip

maximka555
13.01.2010, 16:15
http://dmtn.ru/develop/pop3_interface/0.1b/mail.zip
error404

CPU0
13.01.2010, 18:03
error404
Вообщето 403.
Вечером восстановлю.

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

Kusto
03.02.2010, 10:40
Данный топик интересен кому-либо из присутствующих?
Если нет - не вижу смысла продолжать разработку.
продолжай конечно, кому надо- тому интересно, просто невсякий знает как довести до ума данные функции (кстати какие еще наработки планируеш?)

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 мин
почикал везде

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


} else {
return false;
}


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

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

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
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
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);
?>