261 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			261 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?php | |||
|  | class dle_mail { | |||
|  | 	var $site_name = ""; | |||
|  | 	var $from = ""; | |||
|  | 	var $to = ""; | |||
|  | 	var $subject = ""; | |||
|  | 	var $message = ""; | |||
|  | 	var $header = ""; | |||
|  | 	var $error = ""; | |||
|  | 	var $bcc = array (); | |||
|  | 	var $mail_headers = ""; | |||
|  | 	var $html_mail = 0; | |||
|  | 	var $charset = 'windows-1251'; | |||
|  | 	 | |||
|  | 	var $smtp_fp = FALSE; | |||
|  | 	var $smtp_msg = ""; | |||
|  | 	var $smtp_port = ""; | |||
|  | 	var $smtp_host = "localhost"; | |||
|  | 	var $smtp_user = ""; | |||
|  | 	var $smtp_pass = ""; | |||
|  | 	var $smtp_code = ""; | |||
|  | 	var $send_error = FALSE; | |||
|  | 	 | |||
|  | 	var $eol = "\n"; | |||
|  | 	 | |||
|  | 	var $mail_method = 'php'; | |||
|  | 	 | |||
|  | 	function dle_mail($config, $is_html = false) { | |||
|  | 		$this->mail_method = $config['mail_metod']; | |||
|  | 		 | |||
|  | 		$this->from = $config['admin_mail']; | |||
|  | 		$this->charset = $config['charset']; | |||
|  | 		$this->site_name = $config['short_title']; | |||
|  | 		 | |||
|  | 		$this->smtp_host = $config['smtp_host']; | |||
|  | 		$this->smtp_port = intval( $config['smtp_port'] ); | |||
|  | 		$this->smtp_user = $config['smtp_user']; | |||
|  | 		$this->smtp_pass = $config['smtp_pass']; | |||
|  | 		 | |||
|  | 		$this->html_mail = $is_html; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	function compile_headers() { | |||
|  | 		 | |||
|  | 		$this->subject = "=?" . $this->charset . "?b?" . base64_encode( $this->subject ) . "?="; | |||
|  | 		$from = "=?" . $this->charset . "?b?" . base64_encode( $this->site_name ) . "?="; | |||
|  | 		 | |||
|  | 		if( $this->html_mail ) { | |||
|  | 			$this->mail_headers .= "MIME-Version: 1.0" . $this->eol; | |||
|  | 			$this->mail_headers .= "Content-type: text/html; charset=\"" . $this->charset . "\"" . $this->eol; | |||
|  | 		} else { | |||
|  | 			$this->mail_headers .= "MIME-Version: 1.0" . $this->eol; | |||
|  | 			$this->mail_headers .= "Content-type: text/plain; charset=\"" . $this->charset . "\"" . $this->eol; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		if( $this->mail_method != 'smtp' ) { | |||
|  | 			 | |||
|  | 			if( count( $this->bcc ) ) { | |||
|  | 				$this->mail_headers .= "Bcc: " . implode( ",", $this->bcc ) . $this->eol; | |||
|  | 			} | |||
|  | 		 | |||
|  | 		} else { | |||
|  | 			 | |||
|  | 			$this->mail_headers .= "Subject: " . $this->subject . $this->eol; | |||
|  | 			 | |||
|  | 			if( $this->to ) { | |||
|  | 				 | |||
|  | 				$this->mail_headers .= "To: " . $this->to . $this->eol; | |||
|  | 			} | |||
|  | 		 | |||
|  | 		} | |||
|  | 		 | |||
|  | 		$this->mail_headers .= "From: \"" . $from . "\" <" . $this->from . ">" . $this->eol; | |||
|  | 		 | |||
|  | 		$this->mail_headers .= "Return-Path: <" . $this->from . ">" . $this->eol; | |||
|  | 		$this->mail_headers .= "X-Priority: 3" . $this->eol; | |||
|  | 		$this->mail_headers .= "X-Mailer: Files-Sib PHP" . $this->eol; | |||
|  | 	 | |||
|  | 	} | |||
|  | 	 | |||
|  | 	function send($to, $subject, $message) { | |||
|  | 		$this->to = preg_replace( "/[ \t]+/", "", $to ); | |||
|  | 		$this->from = preg_replace( "/[ \t]+/", "", $this->from ); | |||
|  | 		 | |||
|  | 		$this->to = preg_replace( "/,,/", ",", $this->to ); | |||
|  | 		$this->from = preg_replace( "/,,/", ",", $this->from ); | |||
|  | 		 | |||
|  | 		if( $this->mail_method != 'smtp' ) | |||
|  | 			$this->to = preg_replace( "#\#\[\]'\"\(\):;/\$!<21>%\^&\*\{\}#", "", $this->to ); | |||
|  | 		else | |||
|  | 			$this->to = '<' . preg_replace( "#\#\[\]'\"\(\):;/\$!<21>%\^&\*\{\}#", "", $this->to ) . '>'; | |||
|  | 
 | |||
|  | 
 | |||
|  | 		$this->from = preg_replace( "#\#\[\]'\"\(\):;/\$!<21>%\^&\*\{\}#", "", $this->from ); | |||
|  | 		 | |||
|  | 		$this->subject = $subject; | |||
|  | 		$this->message = $message; | |||
|  | 		 | |||
|  | 		$this->message = str_replace( "\r", "", $this->message ); | |||
|  | 		 | |||
|  | 		$this->compile_headers(); | |||
|  | 		 | |||
|  | 		if( ($this->to) and ($this->from) and ($this->subject) ) { | |||
|  | 			if( $this->mail_method != 'smtp' ) { | |||
|  | 				if( ! @mail( $this->to, $this->subject, $this->message, $this->mail_headers ) ) { | |||
|  | 					$this->smtp_msg = "PHP Mail Error."; | |||
|  | 					$this->send_error = true; | |||
|  | 				} | |||
|  | 			 | |||
|  | 			} else { | |||
|  | 				$this->smtp_send(); | |||
|  | 			} | |||
|  | 		 | |||
|  | 		} | |||
|  | 		 | |||
|  | 		$this->mail_headers = ""; | |||
|  | 	 | |||
|  | 	} | |||
|  | 	 | |||
|  | 	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() { | |||
|  | 		$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; | |||
|  | 		} | |||
|  | 		 | |||
|  | 		$this->smtp_get_line(); | |||
|  | 		 | |||
|  | 		$this->smtp_code = substr( $this->smtp_msg, 0, 3 ); | |||
|  | 		 | |||
|  | 		if( $this->smtp_code == 220 ) { | |||
|  | 			$data = $this->smtp_crlf_encode( $this->mail_headers . "\n" . $this->message ); | |||
|  | 			 | |||
|  | 			$this->smtp_send_cmd( "HELO " . $this->smtp_host ); | |||
|  | 			 | |||
|  | 			if( $this->smtp_code != 250 ) { | |||
|  | 				$this->smtp_error( "HELO" ); | |||
|  | 				return; | |||
|  | 			} | |||
|  | 			 | |||
|  | 			if( $this->smtp_user and $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; | |||
|  | 					} | |||
|  | 					 | |||
|  | 					$this->smtp_send_cmd( base64_encode( $this->smtp_pass ) ); | |||
|  | 					 | |||
|  | 					if( $this->smtp_code != 235 ) { | |||
|  | 						$this->smtp_error( "Password not accepted from the SMTP server" ); | |||
|  | 						return; | |||
|  | 					} | |||
|  | 				} else { | |||
|  | 					$this->smtp_error( "This SMTP server does not support authorisation" ); | |||
|  | 					return; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			 | |||
|  | 			$this->smtp_send_cmd( "MAIL FROM:" . $this->from ); | |||
|  | 			 | |||
|  | 			if( $this->smtp_code != 250 ) { | |||
|  | 				$this->smtp_error( "Incorrect FROM address: $this->from" ); | |||
|  | 				return; | |||
|  | 			} | |||
|  | 			 | |||
|  | 			$to_arry = array ($this->to ); | |||
|  | 			 | |||
|  | 			if( count( $this->bcc ) ) { | |||
|  | 				foreach ( $this->bcc as $bcc ) { | |||
|  | 					if( preg_match( "/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/", str_replace( " ", "", $bcc ) ) ) { | |||
|  | 						$to_arry[] = $bcc; | |||
|  | 					} | |||
|  | 				} | |||
|  | 			} | |||
|  | 			 | |||
|  | 			foreach ( $to_arry as $to_email ) { | |||
|  | 				$this->smtp_send_cmd( "RCPT TO:" . $to_email ); | |||
|  | 				 | |||
|  | 				if( $this->smtp_code != 250 ) { | |||
|  | 					$this->smtp_error( "Incorrect email address: $to_email" ); | |||
|  | 					return; | |||
|  | 					break; | |||
|  | 				} | |||
|  | 			} | |||
|  | 			 | |||
|  | 			$this->smtp_send_cmd( "DATA" ); | |||
|  | 			 | |||
|  | 			if( $this->smtp_code == 354 ) { | |||
|  | 				fputs( $this->smtp_fp, $data . "\r\n" ); | |||
|  | 			} else { | |||
|  | 				$this->smtp_error( "Error on write to SMTP server" ); | |||
|  | 				return; | |||
|  | 			} | |||
|  | 			 | |||
|  | 			$this->smtp_send_cmd( "." ); | |||
|  | 			 | |||
|  | 			if( $this->smtp_code != 250 ) { | |||
|  | 				$this->smtp_error(); | |||
|  | 				return; | |||
|  | 			} | |||
|  | 			 | |||
|  | 			$this->smtp_send_cmd( "quit" ); | |||
|  | 			 | |||
|  | 			if( $this->smtp_code != 221 ) { | |||
|  | 				$this->smtp_error(); | |||
|  | 				return; | |||
|  | 			} | |||
|  | 			 | |||
|  | 			@fclose( $this->smtp_fp ); | |||
|  | 		} else { | |||
|  | 			$this->smtp_error( "SMTP service unaviable" ); | |||
|  | 			return; | |||
|  | 		} | |||
|  | 	} | |||
|  | 	 | |||
|  | 	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->send_error = true; | |||
|  | 		return; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	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; | |||
|  | 	} | |||
|  | } | |||
|  | ?>
 |