SMTP::Data PHP Method

Data() public method

Implements rfc 821: DATA SMTP CODE INTERMEDIATE: 354 [data] . SMTP CODE SUCCESS: 250 SMTP CODE FAILURE: 552,554,451,452 SMTP CODE FAILURE: 451,554 SMTP CODE ERROR : 500,501,503,421
public Data ( $msg_data ) : boolean
return boolean
    public function Data($msg_data)
    {
        $this->error = null;
        // so no confusion is caused
        if (!$this->connected()) {
            $this->error = array('error' => 'Called Data() without being connected');
            return false;
        }
        fwrite($this->smtp_conn, 'DATA' . $this->CRLF);
        $rply = $this->get_lines();
        $code = substr($rply, 0, 3);
        if ($this->do_debug >= 2) {
            echo 'SMTP -> FROM SERVER:' . $rply . $this->CRLF . '<br />';
        }
        if ($code != 354) {
            $this->error = array('error' => 'DATA command not accepted from server', 'smtp_code' => $code, 'smtp_msg' => substr($rply, 4));
            if ($this->do_debug >= 1) {
                echo 'SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '<br />';
            }
            return false;
        }
        /* the server is ready to accept data!
         * according to rfc 821 we should not send more than 1000
         * including the CRLF
         * characters on a single line so we will break the data up
         * into lines by \r and/or \n then if needed we will break
         * each of those into smaller lines to fit within the limit.
         * in addition we will be looking for lines that start with
         * a period '.' and append and additional period '.' to that
         * line. NOTE: this does not count towards limit.
         */
        // normalize the line breaks so we know the explode works
        $msg_data = str_replace("\r\n", "\n", $msg_data);
        $msg_data = str_replace("\r", "\n", $msg_data);
        $lines = explode("\n", $msg_data);
        /* we need to find a good way to determine is headers are
         * in the msg_data or if it is a straight msg body
         * currently I am assuming rfc 822 definitions of msg headers
         * and if the first field of the first line (':' sperated)
         * does not contain a space then it _should_ be a header
         * and we can process all lines before a blank "" line as
         * headers.
         */
        $field = substr($lines[0], 0, strpos($lines[0], ':'));
        $in_headers = false;
        if (!empty($field) && !strstr($field, ' ')) {
            $in_headers = true;
        }
        $max_line_length = 998;
        // used below; set here for ease in change
        while (list(, $line) = @each($lines)) {
            $lines_out = null;
            if ($line == '' && $in_headers) {
                $in_headers = false;
            }
            // ok we need to break this line up into several smaller lines
            while (strlen($line) > $max_line_length) {
                $pos = strrpos(substr($line, 0, $max_line_length), ' ');
                // Patch to fix DOS attack
                if (!$pos) {
                    $pos = $max_line_length - 1;
                    $lines_out[] = substr($line, 0, $pos);
                    $line = substr($line, $pos);
                } else {
                    $lines_out[] = substr($line, 0, $pos);
                    $line = substr($line, $pos + 1);
                }
                /* if processing headers add a LWSP-char to the front of new line
                 * rfc 822 on long msg headers
                 */
                if ($in_headers) {
                    $line = "\t" . $line;
                }
            }
            $lines_out[] = $line;
            // send the lines to the server
            while (list(, $line_out) = @each($lines_out)) {
                if (strlen($line_out) > 0) {
                    if (substr($line_out, 0, 1) == '.') {
                        $line_out = '.' . $line_out;
                    }
                }
                fwrite($this->smtp_conn, $line_out . $this->CRLF);
            }
        }
        // message data has been sent
        fwrite($this->smtp_conn, $this->CRLF . '.' . $this->CRLF);
        $rply = $this->get_lines();
        $code = substr($rply, 0, 3);
        if ($this->do_debug >= 2) {
            echo 'SMTP -> FROM SERVER:' . $rply . $this->CRLF . '<br />';
        }
        if ($code != 250) {
            $this->error = array('error' => 'DATA not accepted from server', 'smtp_code' => $code, 'smtp_msg' => substr($rply, 4));
            if ($this->do_debug >= 1) {
                echo 'SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . $this->CRLF . '<br />';
            }
            return false;
        }
        return true;
    }

Usage Example

Esempio n. 1
0
 function smtp_send($header, $body)
 {
     global $enable_debug;
     $smtp = new SMTP();
     $smtp->do_debug = $enable_debug;
     $hosts = explode(";", $this->Host);
     $index = 0;
     $connection = false;
     while ($index < count($hosts) && $connection == false) {
         if ($smtp->Connect($hosts[$index], $this->Port, $this->Timeout)) {
             $connection = true;
         }
         $index++;
     }
     if (!$connection) {
         $this->error_handler("SMTP Error: could not connect to SMTP host server(s)");
         return false;
     }
     if ($this->blUseAuthLogin) {
         if (!$smtp->AuthHello($this->Helo, $this->AuthUser, $this->AuthPass)) {
             $this->error_handler("SMTP Error: Invalid username/password");
             return false;
         }
     } else {
         $smtp->Hello($this->Helo);
     }
     $smtp->MailFrom(sprintf("<%s>", $this->From));
     for ($i = 0; $i < count($this->to); $i++) {
         if (!$smtp->Recipient(sprintf("<%s>", $this->to[$i][0]))) {
             $this->error_handler("SMTP Error: Recipient not accepted. Verify your relay rules");
             return false;
         }
     }
     for ($i = 0; $i < count($this->cc); $i++) {
         if (!$smtp->Recipient(sprintf("<%s>", $this->cc[$i][0]))) {
             $this->error_handler("SMTP Error: Recipient not accepted. Verify your relay rules");
             return false;
         }
     }
     for ($i = 0; $i < count($this->bcc); $i++) {
         if (!$smtp->Recipient(sprintf("<%s>", $this->bcc[$i][0]))) {
             $this->error_handler("SMTP Error: Recipient not accepted. Verify your relay rules");
             return false;
         }
     }
     if (!$smtp->Data(sprintf("%s%s", $header, $body))) {
         $this->error_handler("SMTP Error: Data not accepted");
         return false;
     }
     $smtp->Quit();
 }
All Usage Examples Of SMTP::Data