Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите решить проблему.. (PHP, отправка почты через SMTP сокетами)

18K
15 сентября 2006 года
Zaher
7 / / 15.09.2006
Написал вот такое:

Код:
<?php

// Based on Invision Power Services Kernel [Email Functions]

class SimpleMailSender
{
    var $from         = "";
    var $to           = "";
    var $subject      = "";
    var $message      = "";

    var $smtp_fp      = FALSE;
    var $smtp_msg     = "";
    var $smtp_port    = 25;
    var $smtp_host    = "localhost";
    var $smtp_user    = "";
    var $smtp_pass    = "";
    var $smtp_code    = "";
    var $mail_method  = 'mail';
    var $error_msg;
    var $error_help;
    var $error;

    function send_mail()
    {
        $this->to   = preg_replace( "/[ \t]+/" , ""  , $this->to   );
        $this->from = preg_replace( "/[ \t]+/" , ""  , $this->from );

        $this->to   = preg_replace( "/,,/"     , ","  , $this->to );
        $this->from = preg_replace( "/,,/"     , ","  , $this->from );

        $this->to     = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->to  );
        $this->from   = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->from);
       
        if ( ($this->from) )
        {
            if ($this->mail_method != 'smtp')
            {
                if ( ! @mail( $this->to, $this->subject, $this->message) )
                {
                    $this->fatal_error("Could not send the email", "Failed at 'mail' command");
                    return FALSE;
                }
                else
                {
                    return TRUE;
                }
            }
            else
            {
                return $this->smtp_send_mail();
            }
        }
        else
        {
            $this->fatal_error("From empty");
            return FALSE;
        }

    }

    function smtp_get_line()
    {
        $this->smtp_msg = "";
       
        while ( $line = fgets( $this->smtp_fp, 515 ) )
        {
            $this->smtp_msg .= $line;
           
            if ( substr($line, 3, 1) == " " )
            {
                break;
            }
        }
    }

    function smtp_send_cmd($cmd)
    {
        $this->smtp_msg  = "";
        $this->smtp_code = "";
       
        fputs( $this->smtp_fp, $cmd."\r\n" );
       
        $this->smtp_get_line();
       
        $this->smtp_code = substr( $this->smtp_msg, 0, 3 );
       
        return $this->smtp_code == "" ? FALSE : TRUE;
    }

    function smtp_error($err = "")
    {
        $this->smtp_msg = $err;
        $this->fatal_error( $err );
        return FALSE;
    }

    function smtp_crlf_encode($data)
    {
        $data .= "\n";
        $data  = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
        $data  = str_replace( "\n.\r\n" , "\n. \r\n", $data );
        return $data;
    }

    function smtp_send_mail()
    {
        $this->smtp_fp = @fsockopen( $this->smtp_host, intval($this->smtp_port), $errno, $errstr, 30 );
       
        if ( ! $this->smtp_fp )
        {
            $this->smtp_error("Could not open a socket to the SMTP server");
            return FALSE;
        }
        $this->smtp_get_line();
        $this->smtp_code = substr( $this->smtp_msg, 0, 3 );
        if ( $this->smtp_code == 220 )
        {
            $data = $this->smtp_crlf_encode($this->message);
            $this->smtp_send_cmd("HELO ".$this->smtp_host);
            if ( $this->smtp_code != 250 )
            {
                $this->smtp_error("HELO");
                return FALSE;
            }
            if ($this->smtp_user OR $this->smtp_pass)
            {
                $this->smtp_send_cmd("AUTH LOGIN");
               
                if ( $this->smtp_code == 334 )
                {
                    $this->smtp_send_cmd( base64_encode($this->smtp_user) );
                   
                    if ( $this->smtp_code != 334  )
                    {
                        $this->smtp_error("Username not accepted from the server");
                        return FALSE;
                    }
                   
                    $this->smtp_send_cmd( base64_encode($this->smtp_pass) );
                   
                    if ( $this->smtp_code != 235 )
                    {
                        $this->smtp_error("Password not accepted from the server");
                        return FALSE;
                    }
                }
                else
                {
                    $this->smtp_error("This server does not support authorisation");
                    return FALSE;
                }
            }

            $this->smtp_send_cmd("MAIL FROM:".$this->from);
           
            if ( $this->smtp_code != 250 )
            {
                $this->smtp_error();
                return FALSE;
            }

            $this->smtp_send_cmd("RCPT TO:".$this->to);
            if ( $this->smtp_code != 250 )
            {
                $this->smtp_error("Incorrect email address: $this->to");
                return FALSE;
            }

            $this->smtp_send_cmd("DATA");
           
            if ( $this->smtp_code == 354 )
            {
                fputs( $this->smtp_fp, $data."\n." );
            }
            else
            {
                $this->smtp_error("Error on write to SMTP server");
                return FALSE;
            }
           
            $this->smtp_send_cmd(".");
           
            if ( $this->smtp_code != 250 )
            {
                $this->smtp_error();
                return FALSE;
            }

            $this->smtp_send_cmd("quit");
           
            if ( $this->smtp_code != 221 )
            {
                $this->smtp_error();
                return FALSE;
            }

            @fclose( $this->smtp_fp );
            return TRUE;
        }
        else
        {
            $this->smtp_error();
            return FALSE;
        }
    }
   
    function fatal_error($msg, $help="")
    {
        $this->error_msg  = $msg;
        $this->error_help = $help;
       
        return FALSE;
    }
}
?>


Когда я отсылаю сообщение и в теле письма пишу !: или Privet :) Poka сообщение приходит пустым :(
В чем дело? Я так понимаю тут проблема с ":" изза хидеров? :confused:
244
15 сентября 2006 года
UAS
2.0K / / 19.07.2006
Выпиши тот фрагмент кода где у тебя есть подозрения. А то читать весь код как-то неохота...
13
15 сентября 2006 года
RussianSpy
3.0K / / 04.07.2006
Блин... Неохота читать столько букв...
18K
15 сентября 2006 года
Zaher
7 / / 15.09.2006
[QUOTE=UAS]Выпиши тот фрагмент кода где у тебя есть подозрения. А то читать весь код как-то неохота...[/QUOTE]

 
Код:
function smtp_crlf_encode($data)
    {
        $data .= "\n";
        $data  = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
        $data  = str_replace( "\n.\r\n" , "\n. \r\n", $data );
        return $data;
    }


Тут?

Код:
$this->smtp_send_cmd("DATA");
           
            if ( $this->smtp_code == 354 )
            {
                fputs( $this->smtp_fp, $data."\n." );
            }
            else
            {
                $this->smtp_error("Error on write to SMTP server");
                return FALSE;
            }


Или тут что-то не так?

Может и где-то еще...
18K
15 сентября 2006 года
Zaher
7 / / 15.09.2006
[QUOTE=RussianSpy]Блин... Неохота читать столько букв...[/QUOTE]

Почта отсылается нормально, автентификация работает, только вот проблемы с ":" в теле письма... :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог