Zend - The PHP Company




Email

Add Code


SMTP Class  

Type: class
Added by: richardhey
Entered: 01/10/2001
Last modified: 31/10/2000
Rating: - (fewer than 3 votes)
Views: 11955
A class to enable you to send email direct through an smtp server. Currently supports all basic commands; HELO, EHLO, MAIL, RCPT, RSET, DATA. Also supports the AUTH LOGIN (basic authentication).


<?php
/***************************************
** Filename.......: class.smtp.inc
** Project........: SMTP Class
** Version........: 1.0.1
** Last Modified..: 11 October 2001
***************************************/

    
define('SMTP_STATUS_NOT_CONNECTED'1TRUE);
    
define('SMTP_STATUS_CONNECTED'2TRUE);

    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;

        
/***************************************
        ** Constructor function. Arguments:
        ** $params - An assoc array of parameters:
        **
        **   host    - The hostname of the smtp server        Default: localhost
        **   port    - The port the smtp server runs on        Default: 25
        **   helo    - What to send as the HELO command        Default: localhost
        **             (typically the hostname of the
        **             machine this script runs on)
        **   auth    - Whether to use basic authentication    Default: FALSE
        **   user    - Username for authentication            Default: <blank>
        **   pass    - Password for authentication            Default: <blank>
        **   timeout - The timeout in seconds for the call    Default: 5
        **             to fsockopen()
        ***************************************/

        
function smtp($params = array()){

            if(!
defined('CRLF'))
                
define('CRLF'"rn"TRUE);

            
$this->authenticated    FALSE;            
            
$this->timeout            5;
            
$this->status            SMTP_STATUS_NOT_CONNECTED;
            
$this->host                'localhost';
            
$this->port                25;
            
$this->helo                'localhost';
            
$this->auth                FALSE;
            
$this->user                '';
            
$this->pass                '';
            
$this->errors           = array();

            foreach(
$params as $key => $value){
                
$this->$key $value;
            }
        }

        
/***************************************
        ** Connect function. This will, when called
        ** statically, create a new smtp object, 
        ** call the connect function (ie this function)
        ** and return it. When not called statically,
        ** it will connect to the server and send
        ** the HELO command.
        ***************************************/

        
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);
                
socket_set_timeout($this->connection0250000);

                
$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 which handles sending the mail.
        ** Arguments:
        ** $params    - Optional assoc array of parameters.
        **            Can contain:
        **              recipients - Indexed array of recipients
        **              from       - The from address. (used in MAIL FROM:),
        **                           this will be the return path
        **              headers    - Indexed array of headers, one header per array entry
        **              body       - The body of the email
        **            It can also contain any of the parameters from the connect()
        **            function
        ***************************************/

        
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()), 03) === '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()), 03) === '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()), 03) === '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()), 03) === '250' ){

                return 
TRUE;

            }else{
                
$this->errors[] = 'RSET 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()), 03) === '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()
                AND 
$this->send_data('MAIL FROM:<'.$from.'>')
                AND 
substr(trim($this->get_data()), 02) === '250' ){

                return 
TRUE;

            }else
                return 
FALSE;
        }

        
/***************************************
        ** Function that handles the RCPT TO: cmd
        ***************************************/
        
        
function rcpt($to){

            if(
$this->is_connected()
                AND 
$this->send_data('RCPT TO:<'.$to.'>')
                AND 
substr(trim($error $this->get_data()), 02) === '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()), 03) === '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.CRLFstrlen($data)+2);
                
            }else
                return 
FALSE;
        }

        
/***************************************
        ** Function to get data.
        ***************************************/

        
function &get_data(){

            
$return '';
            
$line   '';

            if(
is_resource($this->connection)){
                while(
strpos($returnCRLF) === FALSE OR substr($line,3,1) !== ' '){
                    
$line    fgets($this->connection512);
                    
$return .= $line;
                }
                return 
$return;

            }else
                return 
FALSE;
        }

        
/***************************************
        ** Sets a variable
        ***************************************/
        
        
function set($var$value){

            
$this->$var $value;
            return 
TRUE;
        }

    } 
// End of class
?>


Usage Example


Example script available from <A HREF="http://www.phpguru.org">http://www.phpguru.org</A>.


Rate This Script





Search



This Category All Categories