<?php
/*
Class pop3.class.inc
Author: Jointy <bestmischmaker@web.de>
create: 07. May 2003
last cahnge: 25. July 2006
Version: 1.17 (final)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
ChangeLog:
// 08 May 2003
- Version 0.52 (beta) public coming out !!!
- add logging
// 09 May 2003
- Version 0.61 out !!!
- add get_top() function (public)
-------------------------
! POP3 Class get Public !
-------------------------
// 10 May 2003
- add reset() function (public)
- add _checkstate($string) function (private)
- add _stats() function (private)
- add uidl($msg_number) function (public)
// 11 May 2003
- add save2mysql function (public) (beta)
- fixed some errors !!!
// 14 May 2003
- fixed a heavy bug with APOP Server (private func _parse_banner($server_text))
(so sometimes the APOP Authorization goes failed, although the password was correct !!)
// 15 May 2003
- changed error handling in get_office_status(), get_top(), get_mail()
- add APOP Autodetection !!! more in Readme.txt
-----------------------------------
POP3 Class get Version 1.00 (final)
-----------------------------------
// 16 May 2003
- finished save2mysql() function ( public )
// 17 May 2003
- remove some bugs ( save2mysql() )
///////////////////////////////////
finished pop3.class.inc Version: 1.10
///////////////////////////////////
// 20 May 2003
- fixed a bug in get_top()
// 12. July 2003
- fix a bug in get_top()
// 26. July 2003
// fixed an error with noob ! Thanks to "Martin Eisenfuehrer.de" <martin@eisenfuehrer.de>" !
!!! it doesn't named "noob", it is named "noop" !!!
so now the func named "noop()" and it will send the right command "NOOP"
// version 1.14 (final) out
// 22. März 2004
- fix a bug while checking sock_timeout
- fix a bug in _cleanup() while check $this->socket if resource , now it use is_resource function
- fix a bug in _cleanup() and _getnextstring() with $this->socket_status
( php always reported a notice: undefined property (thats fixed) dont do an unset() on a class vars :) )
// 24. März 2004 version 1.15 (-fix update-)
// 25 July 2006 version 1.16 (-fix update-)
- Qmail does send a point (.) instead an (+OK) by getting an email by the get_mail() function.
By the 3 parameter $qmailer you can say that we communicate with a qmail server
BEST THANKS TO Daniel Sepeur that he post this cool bug fix on phpclasses.org
// 01.02.2008 version 1.17 (bug fix)
- fix a bug in the logging function
http://www.phpclasses.org/discuss/package/1120/thread/14/message/42/
BEST THANKS TO DaShiVa
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
*/
class POP3 {
// Socket Vars
var $socket = FALSE;
var $socket_status = FALSE;
var $socket_timeout = "10,500";
var $error = "No Errors";
var $state = "DISCONNECTED";
var $apop_banner = "";
var $apop_detect;
var $log;
var $log_file;
var $log_fp;
var $file_fp;
var $mysql_socket;
// Constructor
function POP3($log = FALSE, $log_file = "", $apop_detect = FALSE)
{
$this->log = $log;
$this->log_file = $log_file;
$this->apop_detect = $apop_detect;
}
/*
Function _cleanup()
Access: Private
*/
function _cleanup()
{
$this->state = "DISCONNECTED";
if(is_array($this->socket_status)) $this->socket_status = FALSE;
if( is_resource($this->socket) )
{
// socket_set_blocking( $this->socket , false ); useless because fclose destroy this socket
@fclose($this->socket);
$this->socket = FALSE;
}
$close_log = "Connection Closed. \r\n";
$close_log .= "/------------------------------------------------------------------- \r\n";
$close_log .= "/--- Log File: ".$this->log_file." \r\n";
$close_log .= "/--- Log Close: ".date('l, d M Y @ H:i:s')." \r\n";
$close_log .= "/------------------------------------------------------------------- \r\n";
if($this->log) $this->_logging($close_log);
if(is_resource($this->mysql_socket))
{
@mysql_close($this->mysql_socket);
$this->mysql_socket = FALSE;
}
if( is_resource($this->log_fp) )
{
@fclose($this->log_fp);
$this->mysql_socket = FALSE;
}
unset($close_log);
}
/*
Function _logging($string)
Access: Private
*/
function _logging($string)
{
if($this->log)
{
if(!$this->log_fp)
{
$this->log_fp = @fopen($this->log_file,"a+");
if(!$this->log_fp)
{
$this->error = "POP3 _logging() - Error: Can't open log file in write mode (".$this->log_file.") !!! -- Connection Closed !!!";
// Took out because we will go in an endless loop, because the cleanup function call the logging function again ;)
// Best Thanks to DaShiVa for his help to make this class better as it is. ;)
// http://www.phpclasses.org/discuss/package/1120/thread/14/message/42/
// $this->_cleanup();
return FALSE;
}
$open_log = "/------------------------------------------------------------------- \r\n";
$open_log .= "/--- Log File: ".$this->log_file." \r\n";
$open_log .= "/--- Log Open: ".date('l, d M Y @ H:i:s')." \r\n";
$open_log .= "/------------------------------------------------------------------- \r\n";
if(!@fwrite($this->log_fp,$open_log,strlen($open_log)))
{
$this->error = "POP3 _logging() - Error: Can't write string to file !!!";
//$this->_cleanup();
return FALSE;
}
unset($open_log);
}
if(substr($string,0,1) != "-" && substr($string,0,1) != "+" && substr($string,-4) != "\r\n" && substr($string,-2) != "\n")
{
$string = $string."\r\n";
}
$string = date("H:i:s")." -- ".$string;
if(!@fwrite($this->log_fp, $string, strlen($string)))
{
$this->error = "POP3 _logging() - Error: Can't write string to file !!! -- Connection Closed !!!";
//$this->_cleanup();
return FALSE;
}
}
return TRUE;
}
/*
Function connect($server, $port, $timeout, $sock_timeout)
Access: Public
// Vars:
- $server ( Server IP or DNS )
- $port ( Server port default is "110" )
- $timeout ( Connection timeout for connect to server )
- $sock_timeout ( Socket timeout for all actions (10 sec 500 msec) = (10,500))
If all right you get true, when not you get false and on $this->error = msg !!!
*/
function connect( $server, $port="110", $timeout = "25" , $sock_timeout = "10,500")
{
if($this->socket)
{
$this->error = "POP3 connect() - Error: Connection also avalible !!!";
return FALSE;
}
if(!trim($server))
{
$this->error = "POP3 connect() - Error: Please give a server address.";
return FALSE;
}
if($port < "1" && $port > "65535" || !trim($port))
{
$this->error = "POP3 connect() - Error: Port not set or out of range (1 - 65535)";
return FALSE;
}
if($timeout < 0 && $timeout > 25 || !trim($timeout))
{
$this->error = "POP3 connect() - Error: Connection Timeout not set or out of range (0 - 25)";
return FALSE;
}
$sock_timeout = explode(",",$sock_timeout);
if( !trim($sock_timeout[0]) || ($sock_timeout[0] < 0 && $sock_timeout[0] > 25) ) // || !preg_match("^[0-9]",sock_timeout[1]) )
{
$this->error = "POP3 connect() - Error: Socket Timeout not set or out of range (0 - 25)";
return FALSE;
}
/*
if(!ereg("([0-9]{2}),([0-9]{3})",$sock_timeout))
{
$this->error = "POP3 connect() - Error: Socket Timeout in invalid Format (Right Format xx,xxx \"10,500\")";
return FALSE;
}
*/
// Check State
if(!$this->_checkstate("connect")) return FALSE;
if( !$this->socket = @fsockopen($server, $port, $errno, $errstr, $timeout ))
{
$this->error = "POP3 connect() - Error: Can't connect to Server. Error: ".$errno." -- ".$errstr;
return FALSE;
}
if(!$this->_logging("Connecting to \"".$server.":".$port."\" !!!")) return FALSE;
// Set Socket Timeout
// It is valid for all other functions !!
socket_set_timeout($this->socket,$sock_timeout[0],$sock_timeout[1]);
socket_set_blocking($this->socket,true);
$response = $this->_getnextstring();
if(!$this->_logging($response))
{
$this->_cleanup();
return FALSE;
}
if(substr($response,0,1) != "+")
{
$this->_cleanup();
$this->error = "POP3 connect() - Error: ".$response;
return FALSE;
}
// Get the server banner for APOP
$this->apop_banner = $this->_parse_banner($response);
$this->state = "AUTHORIZATION";
if(!$this->_logging("STATUS: AUTHORIZATION")) return FALSE;
return TRUE;
}
/*
Function _login($user, $pass)
Access: Public
*/
function login($user, $pass, $apop = "0"){
if(!$this->socket){
$this->error = "POP3 login() - Error: No connection avalible.";
$this->_cleanup();
return FALSE;
}
if( $this->_checkstate("login") ){
if($this->apop_detect){
if($this->apop_banner != ""){
$apop = "1";
}
}
if($apop == "0"){
$response = "";
$cmd = "USER $user";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) == "-" ){
$this->error = "POP3 login() - Error: ".$response;
$this->_cleanup();
return FALSE;
}
$response = "";
$cmd = "PASS $pass";
if(!$this->_logging("PASS ".md5($pass))) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) == "-" ){
$this->error = "POP3 login() - Error: ".$response;
$this->_cleanup();
return FALSE;
}
$this->state = "TRANSACTION";
if(!$this->_logging("STATUS: TRANSACTION")) return FALSE;
return TRUE;
}elseif($apop == "1"){
// APOP Section
// Check is Server Banner for APOP Command given !!!
if(empty($this->apop_banner)){
$this->error = "POP3 login() (APOP) - Error: No Server Banner -- aborted and close connection";
$this->_cleanup();
return FALSE;
}
//echo $this->apop_banner;
$response = "";
// Send APOP Command !!!
$cmd = "APOP ". $user ." ". md5($this->apop_banner.$pass);
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
// Check the response !!!
if(substr($response,0,1) != "+" ){
$this->error = "POP3 login() (APOP) - Error: ".$response;
$this->_cleanup();
return FALSE;
}
$this->state = "TRANSACTION";
if(!$this->_logging("STATUS: TRANSACTION")) return FALSE;
return TRUE;
}else{
$this->error = "POP3 login() - Error: Please set apop var !!! (1 [true] or 0 [false]).";
$this->_cleanup();
return FALSE;
}
}
return FALSE;
}
/*
Func get_top($msg_number,$lines)
Access: Public
*/
function get_top( $msg_number , $lines = "0" )
{
if(!$this->socket)
{
$this->error = "POP3 get_top() - Error: No connection avalible.";
return FALSE;
}
if(!$this->_checkstate("get_top")) return FALSE;
$response = "";
$cmd = "TOP " . $msg_number ." ". $lines;
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,3) != "+OK")
{
$this->error = "POP3 get_top() - Error: ".$response;
return FALSE;
}
// Get Header
$i = "0";
$response = "<HEADER> \r\n";
while(!eregi("^\.\r\n",$response))
{
if(substr($response,0,4) == "\r\n") break;
$output[$i] = $response;
$i++;
$response = $this->_getnextstring();
}
if( $lines == "0" )
{
$response = $this->_getnextstring();
}
$output[$i++] = "</HEADER> \r\n";
// Get $lines
if( $lines != "0" )
{
$response = "<MESSAGE> \r\n";
for($g = 0;$g < $lines; $g++){
if(eregi("^\.\r\n",$response)) break;
$output[$i] = $response;
$i++;
$response = $this->_getnextstring();
}
$output[$i] = "</MESSAGE> \r\n";
}
if(!$this->_logging("Complete.")) return FALSE;
return $output;
}
/*
Function get_mail
Access: Public
*/
function get_mail( $msg_number, $qmailer = FALSE )
{
if(!$this->socket)
{
$this->error = "POP3 get_mail() - Error: No connection avalible.";
return FALSE;
}
if(!$this->_checkstate("get_mail")) return FALSE;
$response = "";
$cmd = "RETR $msg_number";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if ($qmailer == TRUE)
{
if(substr($response,0,1) != '.')
{
$this->error = "POP3 get_mail() - Error: ".$response;
return FALSE;
}
}
else
{
if(substr($response,0,3) != "+OK")
{
$this->error = "POP3 get_mail() - Error: ".$response;
return FALSE;
}
}
// Get MAIL !!!
$i = "0";
$response = "<HEADER> \r\n";
while(!eregi("^\.\r\n",$response))
{
if(substr($response,0,4) == "\r\n") break;
$output[$i] = $response;
$i++;
$response = $this->_getnextstring();
}
$output[$i++] = "</HEADER> \r\n";
$response = "<MESSAGE> \r\n";
while(!eregi("^\.\r\n",$response))
{
$output[$i] = $response;
$i++;
$response = $this->_getnextstring();
}
$output[$i] = "</MESSAGE> \r\n";
if(!$this->_logging("Complete.")) return FALSE;
return $output;
}
/*
Function _check_state()
Access: Private
*/
function _checkstate($string)
{
// Check for delete_mail func
if($string == "delete_mail" || $string == "get_office_status" || $string == "get_mail" || $string == "get_top" || $string == "noop" || $string == "reset" || $string == "uidl" || $string == "stats")
{
$state = "TRANSACTION";
if($this->state != $state){
$this->error = "POP3 $string() - Error: state must be in \"$state\" mode !!! Your state: \"$this->state\" !!!";
return FALSE;
}
return TRUE;
}
// Check for connect func
if($string == "connect")
{
$state = "DISCONNECTED";
$state_1 = "UPDATE";
if($this->state == $state or $this->state == $state_1){
return TRUE;
}
$this->error= "POP3 $string() - Error: state must be in \"$state\" or \"$state_1\" mode !!! Your state: \"$this->state\" !!!";
return FALSE;
}
// Check for login func
if($string == "login")
{
$state = "AUTHORIZATION";
if($this->state != $state){
$this->error = "POP3 $string() - Error: state must be in \"$state\" mode !!! Your state: \"$this->state\" !!!";
return FALSE;
}
return TRUE;
}
$this->error = "POP3 _checkstate() - Error: Not allowed string given !!!";
return FALSE;
}
/*
Function delete_mail($msg_number)
Access: Public
*/
function delete_mail($msg_number = "0")
{
if(!$this->socket){
$this->error = "POP3 delete_mail() - Error: No connection avalible.";
return FALSE;
}
if(!$this->_checkstate("delete_mail")) return FALSE;
if($msg_number == "0"){
$this->error = "POP3 delete_mail() - Error: Please give a valid Messagenumber (Number can't be \"0\").";
return FALSE;
}
// Delete Mail
$response = "";
$cmd = "DELE $msg_number";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 delete_mail() - Error: ".$response;
return FALSE;
}
return TRUE;
}
/*
Function get_office_status
Access: Public
Output an array
Array
(
[count_mails] => 3
[octets] => 2496
[1] => Array
(
[size] => 832
[uid] => 617999468
)
[2] => Array
(
[size] => 882
[uid] => 617999616
)
[3] => Array
(
[size] => 1726
[uid] => 617999782
)
[error] => No Errors
)
*/
function get_office_status(){
if(!$this->socket){
$this->error = "POP3 get_office_status() - Error: No connection avalible.";
$this->_cleanup();
return FALSE;
}
if(!$this->_checkstate("get_office_status")){
$this->_cleanup();
return FALSE;
}
// Put the "STAT" Command !!!
$response = "";
$cmd = "STAT";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,3) != "+OK"){
$this->error = "POP3 get_office_status() - Error: ".$response;
if(!$this->_logging($this->error)) return FALSE;
$this->_cleanup();
return FALSE;
}
// Remove "\r\n" !!!
$response = trim($response);
////////////////////////////////////////////////////////////////////////
// Some Server send the STAT string is finished by "." (+OK 3 52422.)
// - "Yahoo Server"
$lastdigit = substr($response,-1);
if(!ereg("(0-9)",$lastdigit)){
$response = substr($response,0,strlen($response)-1);
}
unset($lastdigit);
////////////////////////////////////////////////////////////////////////
$array = explode(" ",$response);
$output["count_mails"] = $array[1];
$output["octets"] = $array[2];
unset($array);
$response = "";
if($output["count_mails"] != "0"){
// List Command
$cmd = "LIST";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response ="";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,3) != "+OK"){
$this->error = "POP3 get_office_status() - Error: ".$response;
$this->_cleanup();
return FALSE;
}
// Get Message Number and Size !!!
$response = "";
for($i=0;$i<$output["count_mails"];$i++){
$nr=$i+1;
$response = trim($this->_getnextstring());
if(!$this->_logging($response)) return FALSE;
$array = explode(" ",$response);
$output[$nr]["size"] = $array[1];
$response = "";
unset($array);
unset($nr);
}
// $response = $this->_getnextstring();
// echo "<b>".$response."</b>";
// Check is server send "."
if(trim($this->_getnextstring()) != "."){
$this->error = "POP3 get_office_status() - Error: Server does not send "." at the end !!!";
$this->_cleanup();
return FALSE;
}
if(!$this->_logging(".")) return FALSE;
// UIDL Command
$cmd = "UIDL";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = "";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,3) != "+OK"){
$this->error = "POP3 get_office_status() - Error: ".$response;
$this->_cleanup();
return FALSE;
}
// Get UID's
$response = "";
for($i=0;$i<$output["count_mails"];$i++){
$nr=$i+1;
$response = trim($this->_getnextstring());
if(!$this->_logging($response)) return FALSE;
$array = explode(" ", $response);
$output[$nr]["uid"] = $array[1];
$response = "";
unset($array);
unset($nr);
}
// Check is server send "."
if(trim($this->_getnextstring()) != "."){
$this->error = "POP3 get_office_status() - Error: Server does not send "." at the end !!!";
$this->_cleanup();
return FALSE;
}
if(!$this->_logging(".")) return FALSE;
}
return $output;
}
/*
Function save2file($message,$filename)
Access: Public
return written bytes or "false"
*/
function save2file($message,$filename){
$this->file_fp = fopen($filename,"w+");
if(!$this->file_fp){
$this->error = "POP3 save2file() - Error: Can't open file in write mode. (".$filename.")";
if(!$this->_logging($this->error)) return FALSE;
$this->_cleanup();
return FALSE;
}
if(!$this->_logging("LOG FILE: File ".$filename." created.")){
$this->_cleanup();
return FALSE;
}
$count_bytes = "0";
for($i=0;$i<count($message);$i++){
$line = $message[$i];
$str_len = strlen($line);
$count_bytes = $count_bytes + $str_len;
if(!fputs($this->file_fp,$line,$str_len)){
$this->error = "POP3 save2file() - Error: Can't write string to file (".$filename.") !!!";
if(!$this->_logging($this->error)) return FALSE;
$this->_cleanup();
return FALSE;
}
unset($line);
}
if(!$this->_logging("LOG FILE: File ".$filename." (".$count_bytes." Bytes) written.")){
$this->_cleanup();
return FALSE;
}
return $count_bytes;
}
/*
Access: Public
*/
function noop(){
if(!$this->socket){
$this->error = "POP3 noop() - Error: No connection avalible.";
if(!$this->_logging($this->error)) return FALSE;
return FALSE;
}
if(!$this->_checkstate("noop")) return FALSE;
$cmd = "NOOP";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = "";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 noop() - Error: ".$response;
return FALSE;
}
return TRUE;
}
/*
Function reset()
Access: Public
*/
function reset(){
if(!$this->socket){
$this->error = "POP3 reset() - Error: No connection avalible.";
if(!$this->_logging($this->error)) return FALSE;
return FALSE;
}
if(!$this->_checkstate("reset")) return FALSE;
$cmd = "RSET";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = "";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 reset() - Error: ".$response;
return FALSE;
}
return TRUE;
}
/*
Function stats
Access: Private
Get only count of mails and size of maildrop !!!
*/
function _stats(){
if(!$this->socket){
$this->error = "POP3 _stats() - Error: No connection avalible.";
return FALSE;
}
if(!$this->_checkstate("stats")) return FALSE;
$cmd = "STAT";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = $this->_getnextstring();
if(substr($response,0,1) != "+"){
$this->error = "POP3 _stats() - Error: ".$response;
return FALSE;
}
$response = trim($response);
$array = explode(" ",$response);
$output["count_mails"] = $array[1];
$output["octets"] = $array[2];
return $output;
}
/*
Function uidl($msg_number = "0")
Access: Public
*/
function uidl($msg_number = "0"){
if(!$this->socket){
$this->error = "POP3 uidl() - Error: No connection avalible.";
return FALSE;
}
if(!$this->_checkstate("uidl")) return FALSE;
if($msg_number == "0"){
$cmd = "UIDL";
// Get count of mails
$mails = $this->_stats();
if(!$mails) return FALSE;
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = "";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 uidl() - Error: ".$response;
return FALSE;
}
$response = "";
for($i = 1; $i <= $mails["count_mails"];$i++){
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
$response = trim($response);
$array = explode(" ",$response);
$output[$i] = $array[1];
}
return $output;
}else{
$cmd = "UIDL $msg_number";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
$response = "";
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 uidl() - Error: ".$response;
return FALSE;
}
$response = trim($response);
$array = explode(" ",$response);
$output[$array[1]] = $array[2];
return $output;
}
}
/*
Function close()
Access: Public
Close POP3 Connection
*/
function close(){
$response = "";
$cmd = "QUIT";
if(!$this->_logging($cmd)) return FALSE;
if(!$this->_putline($cmd)) return FALSE;
if($this->state == "AUTHORIZATION"){
$this->state = "DISCONNECTED";
}elseif($this->state == "TRANSACTION"){
$this->state = "UPDATE";
}
$response = $this->_getnextstring();
if(!$this->_logging($response)) return FALSE;
if(substr($response,0,1) != "+"){
$this->error = "POP3 close() - Error: ".$response;
return FALSE;
}
$this->socket = FALSE;
$this->_cleanup();
return TRUE;
}
/*
Function _getnextstring()
Access: Private
*/
function _getnextstring( $buffer_size = 512 )
{
$buffer = "";
$buffer = fgets( $this->socket , $buffer_size );
$this->socket_status = socket_get_status( $this->socket );
if( $this->socket_status["timed_out"] )
{
$this->_cleanup();
return "POP3 _getnextstring() - Socket_Timeout_reached.";
}
$this->socket_status = FALSE;
return $buffer;
}
/*
Function _putline()
Access: Private
*/
function _putline($string)
{
$line = "";
$line = $string."\r\n";
if(!fwrite($this->socket , $line , strlen($line)))
{
$this->error = "POP3 _putline() - Error while send \" $string \". -- Connection closed.";
$this->_cleanup();
return FALSE;
}
return TRUE;
}
/*
Function _parse_banner( $server_text )
Access: Private
*/
function _parse_banner ( &$server_text )
{
$outside = true;
$banner = "";
$length = strlen($server_text);
for($count = 0; $count < $length; $count++)
{
$digit = substr($server_text,$count,1);
if($digit != "")
{
if( (!$outside) and ($digit != '<') and ($digit != '>') )
{
$banner .= $digit;
continue;
}
if ($digit == '<')
{
$outside = false;
}
elseif ($digit == '>')
{
$outside = true;
}
}
}
$banner = trim($banner);
if(strlen($banner) != 0 )
{
return "<". $banner .">";
}
return;
}
/*
Funktion save2mysql($message,$mysql_socket,$dir_table = "inbox",$msg_table = "messages",$read = "0")
Access: Public
*/
function save2mysql($message,$socket,$dir_table = "inbox",$msg_table = "messages",$read = "0"){
$this->mysql_socket = $socket;
// Create Table for Mail Header Data
$query = 'CREATE TABLE IF NOT EXISTS `'.$dir_table.'` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`msg_id` TEXT NOT NULL, `from` TEXT NOT NULL, `to` TEXT NOT NULL, `subject` TEXT NOT NULL,
`date` TEXT NOT NULL, `cc` TEXT, `bcc` TEXT, `content_type` TEXT, `content_encode` TEXT,
`mime_version` TEXT, `x_mailer` TEXT, `x_priority` INT( 1 ) DEFAULT \'3\', `reply_to` TEXT, `sender` TEXT,
`mail_followup_to` TEXT, `mail_reply_to` TEXT, `return_receipt_to` TEXT, `disposition_notification_to` TEXT,
`received` TEXT NOT NULL, `create` TIMESTAMP(14) NOT NULL, `read` TINYINT(1) DEFAULT \'0\' NOT NULL,
PRIMARY KEY ( `id` )) TYPE = MYISAM';
if(!mysql_query($query,$this->mysql_socket)){
$this->error = "POP3 save2mysql() - MySQL Error: ". mysql_errno() ." -- ". mysql_error();
$this->_cleanup();
return FALSE;
}
// Create table for messages !!!
$query = 'CREATE TABLE IF NOT EXISTS `'.$msg_table.'` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`unique_id` VARCHAR( 255 ) NOT NULL , `linenumber` INT UNSIGNED NOT NULL , `linetext` TEXT,
PRIMARY KEY ( `id` ) ) TYPE = MYISAM ';
if(!mysql_query($query,$this->mysql_socket)){
$this->error = "POP3 save2mysql() - MySQL Error: ". mysql_errno() ." -- ". mysql_error();
$this->_cleanup();
return FALSE;
}
$i = 0;
while(substr($message[$i],0,9) != "</HEADER>"){
$message[$i] = str_replace("'","\"",$message[$i]);
while(substr($message[$i],0,1) == " "){
$header_keys = array_keys($header);
$header[$header_keys[count($header_keys)-1]] .= $message[$i];
unset($array_keys);
$i++;
}
if(eregi("Message-ID",$message[$i])){
$header["message_id"] = trim($message[$i]);
}
if(eregi("Subject",$message[$i])){
$header["subject"] = trim($message[$i]);
}
$to = substr($message[$i],0,2);
if(eregi("TO",$to)){
$header["to"] = trim($message[$i]);
}
if(eregi("CC",$to)){
$header["cc"] = trim($message[$i]);
}
unset($to);
if(eregi("BCC",$message[$i])){
$header["bcc"] = trim($message[$i]);
}
if(eregi("FROM",$message[$i])){
$header["from"] = trim($message[$i]);
}
if(eregi("DATE",$message[$i])){
$header["date"] = trim($message[$i]);
}
if(eregi("Content-Type",$message[$i])){
$header["content_type"] = trim($message[$i]);
}
if(eregi("Content-Transfer-Encoding",$message[$i])){
$header["content_encode"] = trim($message[$i]);
}
if(eregi("MIME-Version",$message[$i])){
$header["mime_version"] = trim($message[$i]);
}
if(eregi("Reply-To",substr($message[$i],0,8))){
$header["reply_to"] = trim($message[$i]);
}
if(eregi("X-Mailer",$message[$i])){
$header["x_mailer"] = trim($message[$i]);
}
if(eregi("X-Priority",$message[$i])){
$header["x_priority"] = substr(trim($message[$i]),-1);
}
if(eregi("Sender",$message[$i])){
$header["sender"] = trim($message[$i]);
}
if(eregi("Mail-Followup-To",$message[$i])){
$header["mail_followup_to"] = trim($message[$i]);
}
if(eregi("Mail-Reply-To",$message[$i])){
$header["mail_reply_to"] = trim($message[$i]);
}
if(eregi("Return-Receipt-To",$message[$i])){
$header["return_receipt_to"] = trim($message[$i]);
}
if(eregi("Disposition-Notifaction-To",$message[$i])){
$header["disposition_notifaction_to"] = trim($message[$i]);
}
if(eregi("Received",$message[$i])){
if(isset($header["received"])){
$header["received"] .= " <next> ";
$header["received"] .= trim($message[$i]);
}else{
$header["received"] = trim($message[$i]);
}
}
$i++;
}
// Vars that must be set with a value !!!
if(!isset($header["message_id"])) $header["message_id"] = "--";
if(!isset($header["from"])) $header["from"] = "--";
if(!isset($header["to"])) $header["to"] = "--";
if(!isset($header["subject"])) $header["subject"] = "--";
if(!isset($header["date"])) $header["date"] = "--";
if(!isset($header["received"])) $header["received"] = "--";
$unique_id = md5($header["message_id"]);
////////////////////////////////////////////////////////////////////////
// Check is mail exists !!!
$query ='SELECT `unique_id` FROM `'.$msg_table.'` WHERE `unique_id` = \''.$unique_id.'\' LIMIT 0, 1';
if(!$result = mysql_query($query,$this->mysql_socket)){
$this->error = "POP3 save2mysql() - MySQL Error: ". mysql_errno() ." -- ". mysql_error();
$this->_cleanup();
return FALSE;
}
if($rows = mysql_fetch_array($result,MYSQL_ASSOC)){
$this->error = "POP3 save2mysql() - Error: Mail already exists";
$this->_cleanup();
return FALSE;
}
mysql_free_result($result);
////////////////////////////////////////////////////////////////////////
$query = 'INSERT INTO `'.$dir_table.'` ( `id` ,`msg_id` , `from` , `to` , `subject` , `date` ,
`cc` , `bcc` , `content_type` , `content_encode` , `mime_version` , `x_mailer` , `x_priority` ,
`reply_to` , `sender` , `mail_followup_to` , `mail_reply_to` , `return_receipt_to` ,
`disposition_notification_to` , `received` , `create` , `read` ) VALUES ( \'\',\''.$header["message_id"].'\',
\''.$header["from"].'\',\''.$header["to"].'\',\''.$header["subject"].'\',\''.$header["date"].'\',\''.$header["cc"].'\',
\''.$header["bcc"].'\',\''.$header["content_type"].'\',\''.$header["content_encode"].'\',\''.$header["mime_version"].'\',
\''.$header["x_mailer"].'\',\''.$header["x_priority"].'\',\''.$header["reply_to"].'\',
\''.$header["sender"].'\',\''.$header["mail_followup_to"].'\',\''.$header["mail_reply_to"].'\',\''.$header["return_receipt_to"].'\',
\''.$header["dispostion_notification_to"].'\',\''.$header["received"].'\',NOW(),\''.$read.'\')';
if(!$this->_logging("LOG MySQL: Write header ('".$header["message_id"]."') to table ('".$dir_table."') !!")){
$this->_cleanup();
return FALSE;
}
if(!mysql_query($query,$this->mysql_socket)){
$this->error = "POP3 save2mysql() - MySQL Error: ". mysql_errno() ." -- ". mysql_error();
$this->_cleanup();
return FALSE;
}
if(!$this->_logging("LOG MySQL: Write header ('".$header["message_id"]."') complete !!")){
$this->_cleanup();
return FALSE;
}
$count_lines = count($message);
$count_bytes = "0";
if(!$this->_logging("LOG MySQL: Write complete mail (uid '".$unique_id."') to table ('".$msg_table."') !!")){
$this->_cleanup();
return FALSE;
}
for($i = 0;$i < $count_lines;$i++){
$count_bytes = $count_bytes + strlen($message[$i]);
$message[$i] = str_replace("'","\"",$message[$i]);
$query = 'INSERT INTO `'.$msg_table.'` ( `id` , `unique_id` , `linenumber` , `linetext` ) VALUES ( \'\', \''.$unique_id.'\', \''.$i.'\', \''.$message[$i].'\' )';
if(!mysql_query($query,$this->mysql_socket)){
$this->error = "POP3 save2mysql() - MySQL Error: ". mysql_errno() ." -- ". mysql_error();
$this->_cleanup();
return FALSE;
}
}
if(!$this->_logging("LOG MySQL: Write complete mail (uid '".$unique_id."') complete. ( ".$count_bytes." Bytes written) !!")){
$this->_cleanup();
return FALSE;
}
$this->mysql_socket = FALSE;
return $count_bytes;
}
}
?>
|