Проблема с SMTP классом [php]

Discussion in 'PHP' started by Raz0r, 19 Jun 2007.

  1. Raz0r

    Raz0r Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    126
    Likes Received:
    20
    Reputations:
    0
    Написал простенький класс для SMTP, не хочет робить, вернее робит, но только на Yandex.Ru.
    PHP:
    <?php
    class SMTP 
    {

     
    # SMTP Hostname
     
    var $Host "localhost";
     
    # SMTP Server port
     
    var $Port 25;
     
    # SMTP endline
     
    var $CRLF "\r\n";
     
    # User
     
    var $Username "";
     
    # Password
     
    var $Password "";
     
    # Connection var
     
    var $Connection;
     
    # Timeout
     
    var $timeout 30;
     
    # Curr code
     
    var $code;
     
    # Debug
     
    var $debug 1;
     
    # Charset 
     
    var $Charset 'windows-1251';
     
    # type
     
    var $Type 'html';
     
     function 
    Send($mail$subject$message) {
      global 
    $Config,$Lang,$Member;
      
    $this->Connection = @fsockopen($this->Host$this->Port$errno$errstr$this->timeout);
      if(empty(
    $this->Connection)) {
       return 
    false;
      }
      
    $this->get_code();
      
    // EHLO
      
    fputs($this->Connection"EHLO gopneg" $this->CRLF);
      
    $this->get_code();
      if(
    $this->code != 250) {
       if(
    $this->debug == 1) echo '[SMTP class] [Notice] [Server desn\'t accept <b>EHLO</b> message]';
       
    fclose($this->Connection);
       return 
    false
      }
      
    // puts the login attempt
      
    fputs($this->Connection"AUTH LOGIN" $this->CRLF);
      
    $this->get_code();
      if(
    $this->code != 334) {
       if(
    $this->debug == 1) echo '[SMTP class] [Notice] [Server desn\'t accept <b>AUTH LOGIN</b> message]';
       
    fclose($this->Connection);
       return 
    false;
      }
      
    // puts the username
      
    fputs($this->Connectionbase64_encode($this->Username) . $this->CRLF);
      
    $this->get_code();
      if(
    $this->code != 334) {
       if(
    $this->debug == 1) echo '[SMTP class] [Notice] [Wrong username specified]';
       
    fclose($this->Connection);
       return 
    false;
      }
      
    // puts the password
      
    fputs($this->Connectionbase64_encode($this->Password) . $this->CRLF);
      
    $this->get_code();
      if(
    $this->code != 235) {
       if(
    $this->debug == 1) echo '[SMTP class] [Notice] [Wrong password specified]';
       
    fclose($this->Connection);
       return 
    false;
      }
      
    fputs($this->Connection,"MAIL FROM:<" $вар_с_моим_email ">" $this->CRLF); // Smtp user
      
    fputs($this->Connection,"RCPT TO:<" $mail["addr"] . ">" $this->CRLF); // Recipient
      
    fputs($this->Connection,"DATA" $this->CRLF); // START Message
      
    fputs($this->Connection,"From: \"Превед!\" <" $вар_с_моим_email  ">" $this->CRLF); // HEADER (sender)
      
    fputs($this->Connection,"To: " $mail["to"] . " <" $mail["addr"] . ">" $this->CRLF); // HEADER (message recipient)
      
    fputs($this->Connection,"Subject: "$subject."" $this->CRLF); // HEADER (message subject)
      
    fputs($this->Connection,"Content-Type: text/" $this->Type "; charset=\"" $this->Charset "\"\r\n" $this->CRLF); // HEADER (content-type and charset)
      
    fputs($this->Connection$message $this->CRLF); // Message BODY
      
    fputs($this->Connection,"." $this->CRLF); // END message
      
    $this->get_code();
      if(
    $this->code != 250)
      {
       if(
    $this->debug == 1) echo '[SMTP class] [Fatal error] [Unrecognised error on message send stage] [#'.htmlspecialchars($this->code).']';
       
    fclose($this->Connection);
       return 
    false;
      } else {
      
    // exit
      
    if(!empty($this->Connection)) fclose($this->Connection);
      
    // return true
      
    return true;
      }
     }
     function 
    get_code() {
      
    $reply $this->get_lines();
      
    $code substr($reply,0,3);
      return 
    $this->code intval($code);
     }
     function 
    get_lines() {
      
    $data "";
      while(
    $str fgets($this->Connection,515)) {
       
    $data .= $str;
       if(
    substr($str,3,1) == " ") { break; }
      }
      return 
    $data;
     }
    }
    ?>
    Входят данные такого типа:
    PHP:
    $Mail = array(
     
    "to" => "Дядя Вася"// Имя лола
     
    "addr" => "[email protected]"// Мыло лола
    );
    $message $smtp->Send($Mail,"хай васёк, пошли пидь водку!","Тут литр застоялсо уже, пошли выпьем!");
    if(
    $message == 1) { echo "message sended!"; } else { echo "message is not sended"; }
    Где я туплю. Не предлагать юзать паблик скрипты, я хочу понять, в чем ошибка.
     
    #1 Raz0r, 19 Jun 2007
    Last edited: 19 Jun 2007
  2. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    хз може ты много где тупишь, но сразу в глаза бросается это:
    PHP:
      // EHLO
      
    fputs($this->Connection"EHLO gopneg"
    не EHLO, а HELO.
    и пиши не gopneg, а имя пользователя зареганного на сервере (ну если гопнег, это майл аккуан, то оставь:)). На mail.ru точна проверка на пользователя есть, ну по крайней мере точно была!
     
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Не Helo, а Hello :d
     
  4. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    НЕТ!!! именно с одной L. HELO
     
  5. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    helo для smtp, а на яндексе esmtp
    и http://tools.ietf.org/html/rfc1869 к тому же =\
     
    2 people like this.
  6. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Вот это у вас тут прямо Anti-стандарт. Каждый пишет от балды.
    1) HELO и EHLO это разные команды соотв. для SMTP и ESMTP - движков.
    2) HELO в данном контексте пишется с одной L
    3) После HELO должно идти имя ХОСТА а не юзера и не ящика, как один "умный" человек вам советует.

    К топикстартеру: нахер ты вообще это классом сделал?
     
    1 person likes this.
  7. Raz0r

    Raz0r Elder - Старейшина

    Joined:
    7 Jan 2007
    Messages:
    126
    Likes Received:
    20
    Reputations:
    0
    Можно и функцией конечно.
    Вобщем я понял - сначала нужно определить сервер - т.е. Smtp или Esmtp и от этого уже плясать - Ehlo или Helo, после которого уже идет имя хоста.
    Спасибо Kez'у и всем другим за разъяснение моей ошибки, очень признателен.