Помощ - Търсене - Потребители - Събития
Пълна версия: PHP и връзка с отдалечен SMTP сървър
GGbit.info > Hi-Tech > Web разработка > Полезни статии
Naminator_X_
Скрипта по-долу представлява начин да изпратите мейл до някого през сайта си (написан на РНР) дори хоста ви да не позволява да изпращате писма...или просто казано по SMTP протокола.Примери за такива хостове много.Поразрових се, намерих този скрипт и реших да ви го дам...мисля, че ще ви бъде полезен.Можете да ползвате направо copy/paste smile.gif
Код
<?php
/***************************************
** Име на файла.......: class.smtp.inc
** Проект........: SMTP Class
** Версия........: 1.00b
** Последна промяна..: 30 September 2001
***************************************/

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

    class smtp{

        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;

        /***************************************
        ** Конструкторни функций. Аргументи:
        ** $params - масив на променливите:
        **
        **   host    - хост името на smtp сървъра        По принцип е: localhost
        **   port    - порта на smtp сървъра                По принцип е: 25
        **   helo    - Какво да изпрати като команда за добре дошъл към сървъра        По Принцип е: localhost
        **             (в повечето случаи се въвежда хост името )
        **   auth    - Начин на влизане    По принцип е: FALSE
        **   user    - Потребителско име           По принцип е: <blank>
        **   pass    - Парола            По принцип е: <blank>
        **   timeout - Таймоут-а в секунди.    По принцип е: 5
        ***************************************/

        function smtp($params = array()){

            if(!defined('CRLF'))
                define('CRLF', "\r\n", TRUE);
            
            $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;
            }
        }

        /***************************************
        ** Вързваща функция. Когато е повикана ще
        ** създаде нов статичен smtp обект,
        ** чрез повикване на функцията за връзка
        ** и ще върне резултат. Когато не е повикана статично,
        ** ще се свърже със сървъра и ще изпрати
        ** HELO командата.
        ***************************************/

        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->connection, 0, 250000);

                $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;
                }
            }
        }

        /***************************************
        ** Функцията, която изпраща майла.
        ** Аргументи:
        ** $params    - Масив от променливи.
        **            Може да съдържа:
        **              recipients - Индексиран масив от получатели
        **              from       - Адреса "ОТ: ". (използван във формата:),  
        **              headers    - Индексирам масив от хедъри.По един хедър на масив
        **              body       - Съдържанието на мейла
        **            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()){

                // Ще се логваме ли или не? Note the distinction between the auth variable and auth() function
                if($this->auth){
                    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('.');

                return (substr(trim($this->get_data()), 0, 3) === '250');
            }else{
                $this->errors[] = 'Not connected!';
                return FALSE;
            }
        }
        
        /***************************************
        ** Функцията вкарваща командата HELO
        ***************************************/

        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;
            }
        }
        
        /***************************************
        ** Функцията, която вгражда командата EHLO
        ***************************************/

        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;
            }
        }
        
        /***************************************
        ** Функцията, която вгражда командата AUTH
        ***************************************/

        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' ){

                return TRUE;

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

        /***************************************
        ** Функцията, която поддържа командата MAIL FROM:
        ***************************************/
        
        function mail($from){

            if($this->is_connected()
                AND $this->send_data('MAIL FROM:<'.$from.'>')
                AND substr(trim($this->get_data()), 0, 2) === '250' ){

                return TRUE;

            }else
                return FALSE;
        }

        /***************************************
        ** Функцията, която поддържа командата RCPT TO:
        ***************************************/
        
        function rcpt($to){

            if($this->is_connected()
                AND $this->send_data('RCPT TO:<'.$to.'>')
                AND substr(trim($error = $this->get_data()), 0, 2) === '25' ){

                return TRUE;

            }else{
                $this->errors[] = trim(substr(trim($error), 3));
                return FALSE;
            }
        }

        /***************************************
        ** Функцията, която изпраща командата DATA
        ***************************************/

        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 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 &get_data(){

            $return = '';
            $line   = '';

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

            }else
                return FALSE;
        }

        /***************************************
        ** Настройване на оператори
        ***************************************/
        
        function set($var, $value){

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

    } // Край на класа
?>
Relevant Advertise!
Naminator_X_
Както забелязвате класа е максимално опростен.И все пак трябва поне малко да сте се занимавали с РНР за да го разберете и редактирате по свое му.Може би се чудите как работи тази чудесия...е ето как:
Код
<?php
/***************************************
** Име на файла.......: test.php
** Проект........: SMTP Class
** Последна промяна..: 30 September 2001
***************************************/

    /***************************************
    ** Повикайте класа. Хедъра прави изхода
    ** да изглежда "прекрасно" :).
    ***************************************/
    include('class.smtp.inc');
    header('Content-Type: text/plain');

    /***************************************
    ** Няколко настройко, които ще бъдат пратени
    ** към smtp::connect() .
    ***************************************/
    $params['host'] = '10.1.1.2';                // SMTP сървър/хост
    $params['port'] = 25;                        // SMTP порт
    $params['helo'] = exec('hostname');            // HELO командата. В повечето случаи, вашият домейн/хост име
    $params['auth'] = TRUE;                        // TRUE - Изисква се потребителски вход; FALSE Не се изисква потребителски вход
    $params['user'] = 'testuser';                // Потребителско име
    $params['pass'] = 'testuser';                // Парола

    /***************************************
    ** Тези параметри ще бъдат пратени към
    ** smtp->send()
    ***************************************/

    $send_params['recipients']    = array('richard@[10.1.1.2]');                            // Получателя (може да са няколко)
    $send_params['headers']        = array(
                                        'From: "Richard Heyes" <richard@[10.1.1.2]>',    // Хедъри
                                        'To: richard@[10.1.1.2]',
                                        'Subject: Test email'
                                       );
    $send_params['from']        = 'richard@[10.1.1.2]';                                    // Това се ползва за командата MAIL FROM:
                                                                                        // It should end up as the Return-Path: header
    $send_params['body']        = '.Test email.';                                        // Съдържанието на мейла


    /***************************************
    ** Кодът, който създава обекта и изшраща
    ** писмото
    ***************************************/

    if(is_object($smtp = smtp::connect($params)) AND $smtp->send($send_params)){
        echo 'Email sent successfully!'."\r\n\r\n";

        // Всичкият неизпратен мейл ще бъде записан в error оператора.
        print_r($smtp->errors);

    }else{
        echo 'Error sending mail'."\r\n\r\n";
        
        // Причината за неосъществяването трябва се крие в error оператора
        print_r($smtp->errors);
    }

?>

Е това е в общи линий...естествено трябва да модифицирате малко example.php като за вашите нужди.Скрипта не е мой, аз просто го преведох.Скрипта е безплатен и е Open-Source (не бъркайте едното с другото).Това е един от лесните класове за тази работа.И въпреки простотата си върши чудеса.Надявам се да помогне на някого.

Автор: Richard Heyes@phpclasses.org United Kingdom
Път до скрипта: phpclasses.org

П.П. Съжалявам за двойният пост, обаче това цялото инфо неможа да се събере на едно
Това е "lo-fi" версия на нашия форум. За да видите пълната версия, моля натиснете тук.
Invision Power Board © 2001-2018 Invision Power Services, Inc.