Tema: smtp.php
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/03/2009, 02:35
Gero_xh
 
Fecha de Ingreso: junio-2008
Mensajes: 160
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: smtp.php

<?php

define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE);

define('SMTP_STATUS_CONNECTED', 2, TRUE);

class smtp{

var $authenticated;

var $connection;

var $recipients;

var $headers;

var $timeout;

var $errors;

var $status;

var $body;

var $from;

var $host;

var $port;

var $helo;

var $auth;

var $user;

var $pass;




function smtp($params = array()){

$cfg = CerConfiguration::getInstance();



if(!defined('CRLF'))

define('CRLF', "\r\n", TRUE);



$this->authenticated = FALSE;

$this->timeout = 5;

$this->status = SMTP_STATUS_NOT_CONNECTED;

$this->host = $cfg->settings["smtp_server"]; // 'localhost'

$this->port = 587;

$this->helo = 'localhost';

$this->auth = FALSE;

$this->user = '';

$this->pass = '';

$this->errors = array();



foreach($params as $key => $value){

$this->$key = $value;

}

}


function &connect($params = array()){



if(!isset($this->status)){

$obj = new smtp($params);

if($obj->connect()){

$obj->status = SMTP_STATUS_CONNECTED;

}



return $obj;



}else{

$this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);

if(function_exists('socket_set_timeout')){

@socket_set_timeout($this->connection, 5, 0);

}



$greeting = $this->get_data();

if(is_resource($this->connection)){

return $this->auth ? $this->ehlo() : $this->helo();

}else{

$this->errors[] = 'Failed to connect to server: '.$errstr;

return FALSE;

}

}

}


function send($params = array()){



foreach($params as $key => $value){

$this->set($key, $value);

}



if($this->is_connected()){



// Do we auth or not? Note the distinction between the auth variable and auth() function

if($this->auth AND !$this->authenticated){

if(!$this->auth())

return FALSE;

}



$this->mail($this->from);

if(is_array($this->recipients))

foreach($this->recipients as $value)

$this->rcpt($value);

else

$this->rcpt($this->recipients);



if(!$this->data())

return FALSE;



// Transparency

$headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers)));

$body = str_replace(CRLF.'.', CRLF.'..', $this->body);

$body = $body[0] == '.' ? '.'.$body : $body;



$this->send_data($headers);

$this->send_data('');

$this->send_data($body);

$this->send_data('.');



$result = (substr(trim($this->get_data()), 0, 3) === '250');

//$this->rset();

return $result;

}else{

$this->errors[] = 'Not connected!';

return FALSE;

}

}



/**

* Function to implement HELO cmd

*/



function helo(){

if(is_resource($this->connection)

AND $this->send_data('HELO '.$this->helo)

AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){



return TRUE;



}else{

$this->errors[] = 'HELO command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}



/**

* Function to implement EHLO cmd

*/



function ehlo(){

if(is_resource($this->connection)

AND $this->send_data('EHLO '.$this->helo)

AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){



return TRUE;



}else{

$this->errors[] = 'EHLO command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}



/**

* Function to implement RSET cmd

*/



function rset(){

if(is_resource($this->connection)

AND $this->send_data('RSET')

AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){



return TRUE;



}else{

$this->errors[] = 'RSET command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}



/**

* Function to implement QUIT cmd

*/



function quit(){

if(is_resource($this->connection)

AND $this->send_data('QUIT')

AND substr(trim($error = $this->get_data()), 0, 3) === '221' ){



fclose($this->connection);

$this->status = SMTP_STATUS_NOT_CONNECTED;

return TRUE;



}else{

$this->errors[] = 'QUIT command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}



/**

* Function to implement AUTH cmd

*/



function auth(){

if(is_resource($this->connection)

AND $this->send_data('AUTH LOGIN')

AND substr(trim($error = $this->get_data()), 0, 3) === '334'

AND $this->send_data(base64_encode($this->user)) // Send username

AND substr(trim($error = $this->get_data()),0,3) === '334'

AND $this->send_data(base64_encode($this->pass)) // Send password

AND substr(trim($error = $this->get_data()),0,3) === '235' ){



$this->authenticated = TRUE;

return TRUE;



}else{

$this->errors[] = 'AUTH command failed: ' . trim(substr(trim($error),3));

return FALSE;

}

}



/**

* Function that handles the MAIL FROM: cmd

*/



function mail($from){



if($this->is_connected()) {

$from = trim($from);

if(strstr($from, "<")) {

$from = strstr($from, "<");

$from = substr($from, 1, -1);

}

if($this->send_data('MAIL FROM:<'.$from.'>')

&& substr(trim($this->get_data()), 0, 2) === '25') {

return TRUE;

}

}

else

return FALSE;

}



/**

* Function that handles the RCPT TO: cmd

*/



function rcpt($to){



if($this->is_connected()) {

$to = trim($to);

if(strstr($to, "<")) {

$to = strstr($to, "<");

$to = substr($to, 1, -1);

}

if($this->send_data('RCPT TO:<'.$to.'>')

&& substr(trim($error = $this->get_data()), 0, 2) === '25' ) {

return TRUE;

}

}

else {

$this->errors[] = trim(substr(trim($error), 3));

return FALSE;

}

}



/**

* Function that sends the DATA cmd

*/



function data(){



if($this->is_connected()

AND $this->send_data('DATA')

AND substr(trim($error = $this->get_data()), 0, 3) === '354' ){



return TRUE;



}else{

$this->errors[] = trim(substr(trim($error), 3));

return FALSE;

}

}



/**

* Function to determine if this object

* is connected to the server or not.

*/



function is_connected(){



return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED));

}



/**

* Function to send a bit of data

*/



function send_data($data){



if(is_resource($this->connection)){

return fwrite($this->connection, $data.CRLF, strlen($data)+2);



}else

return FALSE;

}



/**

* Function to get data.

*/



function &get_data(){



$return = '';

$line = '';

$loops = 0;



if(is_resource($this->connection)){

while((strpos($return, CRLF) === FALSE OR substr($line,3,1) !== ' ') AND $loops < 100){

$line = fgets($this->connection, 512);

$return .= $line;

$loops++;

}

return $return;



}else

return FALSE;

}



/**

* Sets a variable

*/



function set($var, $value){



$this->$var = $value;

return TRUE;

}



} // End of class

?>

Última edición por Gero_xh; 20/03/2009 a las 10:14