⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.smtp.php

📁 极限网络智能办公系统 - Office Automation 2008 官方100% 源码
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?php
 

class SMTP
{

	public $SMTP_PORT = 25;
	public $CRLF = "\r\n";
	public $do_debug = NULL;
	public $smtp_conn = NULL;
	public $error = NULL;
	public $helo_rply = NULL;

	public function SMTP( )
	{
		$this->smtp_conn = 0;
		$this->error = null;
		$this->helo_rply = null;
		$this->do_debug = 0;
	}

	public function Connect( $host, $port = 0, $tval = 30 )
	{
		$this->error = null;
		if ( $this->connected( ) )
		{
			$this->error = array( "error" => "Already connected to a server" );
			return false;
		}
		if ( empty( $port ) )
		{
			$port = $this->SMTP_PORT;
		}
		$this->smtp_conn = fsockopen( $host, $port, &$errno, &$errstr, $tval );
		if ( empty( $this->smtp_conn ) )
		{
			$this->error = array(
				"error" => "Failed to connect to server",
				"errno" => $errno,
				"errstr" => $errstr
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].( ": ".$errstr." ({$errno})" ).$this->CRLF;
			}
			return false;
		}
		if ( substr( PHP_OS, 0, 3 ) != "WIN" )
		{
			socket_set_timeout( $this->smtp_conn, $tval, 0 );
		}
		$announce = $this->get_lines( );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER:".$this->CRLF.$announce;
		}
		return true;
	}

	public function Authenticate( $username, $password )
	{
		fputs( $this->smtp_conn, "AUTH LOGIN".$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( $code != 334 )
		{
			$this->error = array(
				"error" => "AUTH not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		fputs( $this->smtp_conn, base64_encode( $username ).$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( $code != 334 )
		{
			$this->error = array(
				"error" => "Username not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		fputs( $this->smtp_conn, base64_encode( $password ).$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( $code != 235 )
		{
			$this->error = array(
				"error" => "Password not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		return true;
	}

	public function Connected( )
	{
		if ( !empty( $this->smtp_conn ) )
		{
			$sock_status = socket_get_status( $this->smtp_conn );
			if ( $sock_status['eof'] )
			{
				if ( 1 <= $this->do_debug )
				{
					echo "SMTP -> NOTICE:".$this->CRLF."EOF caught while checking if connected";
				}
				$this->Close( );
				return false;
			}
			return true;
		}
		return false;
	}

	public function Close( )
	{
		$this->error = null;
		$this->helo_rply = null;
		if ( !empty( $this->smtp_conn ) )
		{
			fclose( $this->smtp_conn );
			$this->smtp_conn = 0;
		}
	}

	public function Data( $msg_data )
	{
		$this->error = null;
		if ( !$this->connected( ) )
		{
			$this->error = array( "error" => "Called Data() without being connected" );
			return false;
		}
		fputs( $this->smtp_conn, "DATA".$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER:".$this->CRLF.$rply;
		}
		if ( $code != 354 )
		{
			$this->error = array(
				"error" => "DATA command not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		$msg_data = str_replace( "\r\n", "\n", $msg_data );
		$msg_data = str_replace( "\r", "\n", $msg_data );
		$lines = explode( "\n", $msg_data );
		$field = substr( $lines[0], 0, strpos( $lines[0], ":" ) );
		$in_headers = false;
		if ( !empty( $field ) || !strstr( $field, " " ) )
		{
			$in_headers = true;
		}
		$max_line_length = 998;
		while ( list( , $line ) = each( &$lines ) )
		{
			$lines_out = null;
			if ( $line == "" && $in_headers )
			{
				$in_headers = false;
			}
			while ( $max_line_length < strlen( $line ) )
			{
				$pos = strrpos( substr( $line, 0, $max_line_length ), " " );
				if ( !$pos )
				{
					$pos = $max_line_length - 1;
				}
				$lines_out[] = substr( $line, 0, $pos );
				$line = substr( $line, $pos + 1 );
				if ( $in_headers )
				{
					$line = "\t".$line;
				}
			}
			$lines_out[] = $line;
			while ( list( , $line_out ) = each( &$lines_out ) )
			{
				if ( 0 < strlen( $line_out ) && substr( $line_out, 0, 1 ) == "." )
				{
					$line_out = ".".$line_out;
				}
				fputs( $this->smtp_conn, $line_out.$this->CRLF );
			}
		}
		fputs( $this->smtp_conn, $this->CRLF.".".$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER:".$this->CRLF.$rply;
		}
		if ( $code != 250 )
		{
			$this->error = array(
				"error" => "DATA not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		return true;
	}

	public function Expand( $name )
	{
		$this->error = null;
		if ( !$this->connected( ) )
		{
			$this->error = array( "error" => "Called Expand() without being connected" );
			return false;
		}
		fputs( $this->smtp_conn, "EXPN ".$name.$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER:".$this->CRLF.$rply;
		}
		if ( $code != 250 )
		{
			$this->error = array(
				"error" => "EXPN not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		$entries = explode( $this->CRLF, $rply );
		while ( list( , $l ) = each( &$entries ) )
		{
			$list[] = substr( $l, 4 );
		}
		return $list;
	}

	public function Hello( $host = "" )
	{
		$this->error = null;
		if ( !$this->connected( ) )
		{
			$this->error = array( "error" => "Called Hello() without being connected" );
			return false;
		}
		if ( empty( $host ) )
		{
			$host = "localhost";
		}
		if ( !$this->SendHello( "EHLO", $host ) || !$this->SendHello( "HELO", $host ) )
		{
			return false;
		}
		return true;
	}

	public function SendHello( $hello, $host )
	{
		fputs( $this->smtp_conn, $hello." ".$host.$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER: ".$this->CRLF.$rply;
		}
		if ( $code != 250 )
		{
			$this->error = array(
				"error" => $hello." not accepted from server",
				"smtp_code" => $code,
				"smtp_msg" => substr( $rply, 4 )
			);
			if ( 1 <= $this->do_debug )
			{
				echo "SMTP -> ERROR: ".$this->error['error'].": ".$rply.$this->CRLF;
			}
			return false;
		}
		$this->helo_rply = $rply;
		return true;
	}

	public function Help( $keyword = "" )
	{
		$this->error = null;
		if ( !$this->connected( ) )
		{
			$this->error = array( "error" => "Called Help() without being connected" );
			return false;
		}
		$extra = "";
		if ( !empty( $keyword ) )
		{
			$extra = " ".$keyword;
		}
		fputs( $this->smtp_conn, "HELP".$extra.$this->CRLF );
		$rply = $this->get_lines( );
		$code = substr( $rply, 0, 3 );
		if ( 2 <= $this->do_debug )
		{
			echo "SMTP -> FROM SERVER:".$this->CRLF.$rply;
		}
		if ( $code != 211 && $code != 214 )
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -