2011-12-21 158 views
1

造成錯誤我試圖管道傳入電子郵件到一個PHP腳本SMTP電子郵件類輸出上pipe.php

,並使用SMTP郵件類從那裏 即時作出迴應,現在工作正常 在管道作爲你可能知道 PHP腳本不應該發送任何輸出或失敗

當我回復傳入的電子郵件與簡單的郵件功能一切正常,但一旦我包括我的smtp類,我收到一封郵件交付失敗,加上我的迴應!

,如果我與SMTP類發送的回答,我只是得到一個傳遞失敗的電子郵件
現在我的猜測是,應該對SMTP一流的輸出,我可以看到

這裏是我的SMTP類:

<?php 
class Mail { 
    private $smtpServer = 'you.smtp_server.com'; 
    private $port = '25'; 
    private $timeout = '45'; 
    private $username = '[email protected]_domain.com'; 
    private $password = 'YouPassword'; 
    private $newline = "\r\n"; 
    private $localdomain = 'you_domain.com'; 
    private $charset = 'iso-8859-1'; 
    private $contentTransferEncoding = false; 

    // Do not change anything below 
    private $smtpConnect = false; 
    private $to = false; 
    private $subject = false; 
    private $message = false; 
    private $headers = false; 
    private $logArray = array(); // Array response message for debug 
    private $Error = ''; 

    public function __construct($to, $subject, $message , $smtp_id=1) { 
     $smtp = setting::get_smtp($smtp_id); 
     if($smtp){ 
       $this->from  = $smtp->from; 
     $this->username = $smtp->username; 
     $this->password = $smtp->password; 
     $this->smtpServer = $smtp->address; 
     $this->port  = $smtp->port; 
     $this->localdomain= $smtp->from; 
     $this->to = &$to; 
     $this->subject = &$subject; 
     $this->message = &$message; 
     // Connect to server 
     if(!$this->Connect2Server()) { 
      // Display error message 
      echo $this->Error.$this->newline.'<!-- '.$this->newline; 
      print_r($this->logArray); 
      echo $this->newline.'-->'.$this->newline; 
      return false; 
     } 
     return true; 
     } 
    } 

    private function Connect2Server() { 
     // Connect to server 
     $this->smtpConnect = fsockopen($this->smtpServer,$this->port,$errno,$error,$this->timeout); 
     $this->logArray['CONNECT_RESPONSE'] = $this->readResponse(); 

     if (!is_resource($this->smtpConnect)) { 
      return false; 
     } 
     $this->logArray['connection'] = "Connection accepted: $smtpResponse"; 
     // Hi, server! 
     $this->sendCommand("EHLO $this->localdomain"); 
     $this->logArray['EHLO'] = $this->readResponse(); 
     // Let's know each other 
     $this->sendCommand('AUTH LOGIN'); 
     $this->logArray['AUTH_REQUEST'] = $this->readResponse(); 
     // My name... 
     $this->sendCommand(base64_encode($this->username)); 
     $this->logArray['REQUEST_USER'] = $this->readResponse(); 
     // My password.. 
     $this->sendCommand(base64_encode($this->password)); 
     $this->logArray['REQUEST_PASSWD'] = $this->readResponse(); 
     // If error in response auth... 
     if (substr($this->logArray['REQUEST_PASSWD'],0,3)!='235') { 
      $this->Error .= 'Authorization error! '.$this->logArray['REQUEST_PASSWD'].$this->newline; 
      return false; 
     } 
     // "From" mail... 
     $this->sendCommand("MAIL FROM: $this->from"); 
     $this->logArray['MAIL_FROM_RESPONSE'] = $this->readResponse(); 
     if (substr($this->logArray['MAIL_FROM_RESPONSE'],0,3)!='250') { 
      $this->Error .= 'Mistake in sender\'s address! '.$this->logArray['MAIL_FROM_RESPONSE'].$this->newline; 
      return false; 
     } 
     // "To" address 
     $this->sendCommand("RCPT TO: $this->to"); 
     $this->logArray['RCPT_TO_RESPONCE'] = $this->readResponse(); 
     if (substr($this->logArray['RCPT_TO_RESPONCE'],0,3)!='250') { 
      $this->Error .= 'Mistake in reciepent address! '.$this->logArray['RCPT_TO_RESPONCE'].$this->newline; 
     } 
     // Send data to server 
     $this->sendCommand('DATA'); 
     $this->logArray['DATA_RESPONSE'] = $this->readResponse(); 
     // Send mail message 
     if (!$this->sendMail()) return false; 
     // Good bye server! =) 
     $this->sendCommand('QUIT'); 
     $this->logArray['QUIT_RESPONSE'] = $this->readResponse(); 
     // Close smtp connect 
     fclose($this->smtpConnect); 
     return true; 
    } 
    // Function send mail 
    private function sendMail() { 
     $this->sendHeaders(); 
     $this->sendCommand($this->message); 
     $this->sendCommand('.'); 
     $this->logArray['SEND_DATA_RESPONSE'] = $this->readResponse(); 
     if(substr($this->logArray['SEND_DATA_RESPONSE'],0,3)!='250') { 
      $this->Error .= 'Mistake in sending data! '.$this->logArray['SEND_DATA_RESPONSE'].$this->newline; 
      return false; 
     } 
     return true; 
    } 
    // Function read response 
    private function readResponse() { 
     $data=""; 
     while($str = fgets($this->smtpConnect,4096)) 
     { 
      $data .= $str; 
      if(substr($str,3,1) == " ") { break; } 
     } 
     return $data; 
    } 
    // function send command to server 
    private function sendCommand($string) { 
     fputs($this->smtpConnect,$string.$this->newline); 
     return ; 
    } 
    // function send headers 
    private function sendHeaders() { 
     $this->sendCommand("Date: ".date("D, j M Y G:i:s")." +0700"); 
     $this->sendCommand("From: <$this->from>"); 
     $this->sendCommand("Reply-To: <$this->from>"); 
     $this->sendCommand("To: <$this->to>"); 
     $this->sendCommand("Subject: $this->subject"); 
     $this->sendCommand("MIME-Version: 1.0"); 
     $this->sendCommand("Content-Type: text/html; charset=$this->charset"); 
     if ($this->contentTransferEncoding) $this->sendCommand("Content-Transfer-Encoding: $this->contentTransferEncoding"); 
     $this->sendCommand($this->newline); 
     return ; 
    } 

    public function __destruct() { 
     if (is_resource($this->smtpConnect)) fclose($this->smtpConnect); 
    } 
} 
?> 

回答

0

結帳phpmailer - 它具有多種功能,易於使用,有文檔記錄和社區支持。它可能需要較少的時間來部署,而不是調試一個自定義的SMTP實現。這裏是一個示例項目的片段...

function sendEmail($to, $message, $message_txt) 
{  
    require_once('phpmailer/class.phpmailer.php'); 

    $mail    = new PHPMailer(); 
    $body    = $message; 
    $body    = @eregi_replace("[\]",'',$body); 
    $mail->IsSMTP(); // telling the class to use SMTP 
    $mail->Host  = "mail.gmail.com"; // SMTP server 
    $mail->SMTPDebug = 2;      // enables SMTP debug information (for testing) 
               // 1 = errors and messages 
               // 2 = messages only 
    $mail->SMTPAuth = true;     // enable SMTP authentication 
    $mail->SMTPSecure = "ssl";     // sets the prefix to the servier 
    $mail->Host  = "smtp.gmail.com";  // sets GMAIL as the SMTP server 
    $mail->Port  = 465;     // set the SMTP port for the GMAIL server 
    $mail->Username = "[email protected]"; // GMAIL username 
    $mail->Password = "password";   // GMAIL password 
    $mail->SetFrom('[email protected]', 'John'); 
    $mail->AddReplyTo("[email protected]", "John"); 
    $mail->Subject = "Subject"; 

    $mail->AltBody = $message_txt; // optional, comment out and test 

    $mail->MsgHTML($body); 

    $address = $to; 
    $mail->AddAddress($address); 

    return $mail->Send(); 
} 

sendEmail('[email protected]', '<b>hey john</b>', 'hey john');