Changeset View
Changeset View
Standalone View
Standalone View
externals/phpmailer/class.smtp.php
<?php | <?php | ||||
/*~ class.smtp.php | /*~ class.smtp.php | ||||
.---------------------------------------------------------------------------. | .---------------------------------------------------------------------------. | ||||
| Software: PHPMailer - PHP email class | | | Software: PHPMailer - PHP email class | | ||||
| Version: 5.1 | | | Version: 5.1 | | ||||
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) | | | Contact: via sourceforge.net support pages (also www.codeworxtech.com) | | ||||
| Info: http://phpmailer.sourceforge.net | | | Info: http://phpmailer.sourceforge.net | | ||||
| Support: http://sourceforge.net/projects/phpmailer/ | | | Support: http://sourceforge.net/projects/phpmailer/ | | ||||
| ------------------------------------------------------------------------- | | | ------------------------------------------------------------------------- | | ||||
| Admin: Andy Prevost (project admininistrator) | | | Admin: Andy Prevost (project admininistrator) | | ||||
| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net | | | Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net | | ||||
| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | | | : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | | ||||
| Founder: Brent R. Matzelle (original founder) | | | Founder: Brent R. Matzelle (original founder) | | ||||
| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | | | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | | ||||
| Copyright (c) 2001-2003, Brent R. Matzelle | | | Copyright (c) 2001-2003, Brent R. Matzelle | | ||||
| ------------------------------------------------------------------------- | | | ------------------------------------------------------------------------- | | ||||
| License: Distributed under the Lesser General Public License (LGPL) | | | License: Distributed under the Lesser General Public License (LGPL) | | ||||
| http://www.gnu.org/copyleft/lesser.html | | | http://www.gnu.org/copyleft/lesser.html | | ||||
| This program is distributed in the hope that it will be useful - WITHOUT | | | This program is distributed in the hope that it will be useful - WITHOUT | | ||||
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | | | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | | ||||
| FITNESS FOR A PARTICULAR PURPOSE. | | | FITNESS FOR A PARTICULAR PURPOSE. | | ||||
| ------------------------------------------------------------------------- | | | ------------------------------------------------------------------------- | | ||||
| We offer a number of paid services (www.codeworxtech.com): | | | We offer a number of paid services (www.codeworxtech.com): | | ||||
| - Web Hosting on highly optimized fast and secure servers | | | - Web Hosting on highly optimized fast and secure servers | | ||||
| - Technology Consulting | | | - Technology Consulting | | ||||
| - Oursourcing (highly qualified programmers and graphic designers) | | | - Oursourcing (highly qualified programmers and graphic designers) | | ||||
'---------------------------------------------------------------------------' | '---------------------------------------------------------------------------' | ||||
*/ | */ | ||||
/** | /** | ||||
* PHPMailer - PHP SMTP email transport class | * PHPMailer - PHP SMTP email transport class | ||||
* NOTE: Designed for use with PHP version 5 and up | * NOTE: Designed for use with PHP version 5 and up | ||||
* @package PHPMailer | * @package PHPMailer | ||||
* @author Andy Prevost | * @author Andy Prevost | ||||
* @author Marcus Bointon | * @author Marcus Bointon | ||||
* @copyright 2004 - 2008 Andy Prevost | * @copyright 2004 - 2008 Andy Prevost | ||||
* @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL) | * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL) | ||||
* @version $Id: class.smtp.php 444 2009-05-05 11:22:26Z coolbru $ | * @version $Id: class.smtp.php 444 2009-05-05 11:22:26Z coolbru $ | ||||
*/ | */ | ||||
/** | /** | ||||
* SMTP is rfc 821 compliant and implements all the rfc 821 SMTP | * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP | ||||
* commands except TURN which will always return a not implemented | * commands except TURN which will always return a not implemented | ||||
* error. SMTP also provides some utility methods for sending mail | * error. SMTP also provides some utility methods for sending mail | ||||
* to an SMTP server. | * to an SMTP server. | ||||
* original author: Chris Ryan | * original author: Chris Ryan | ||||
*/ | */ | ||||
class SMTP { | class SMTP { | ||||
/** | /** | ||||
* SMTP server port | * SMTP server port | ||||
* @var int | * @var int | ||||
*/ | */ | ||||
public $SMTP_PORT = 25; | public $SMTP_PORT = 25; | ||||
/** | /** | ||||
* SMTP reply line ending | * SMTP reply line ending | ||||
* @var string | * @var string | ||||
*/ | */ | ||||
public $CRLF = "\r\n"; | public $CRLF = "\r\n"; | ||||
/** | /** | ||||
* Sets whether debugging is turned on | * Sets whether debugging is turned on | ||||
* @var bool | * @var bool | ||||
*/ | */ | ||||
public $do_debug; // the level of debug to perform | public $do_debug; // the level of debug to perform | ||||
/** | /** | ||||
* Sets VERP use on/off (default is off) | * Sets VERP use on/off (default is off) | ||||
* @var bool | * @var bool | ||||
*/ | */ | ||||
public $do_verp = false; | public $do_verp = false; | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
// PROPERTIES, PRIVATE AND PROTECTED | // PROPERTIES, PRIVATE AND PROTECTED | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
private $smtp_conn; // the socket to the server | private $smtp_conn; // the socket to the server | ||||
private $error; // error if any on the last call | private $error; // error if any on the last call | ||||
private $helo_rply; // the reply the server sent to us for HELO | private $helo_rply; // the reply the server sent to us for HELO | ||||
/** | /** | ||||
* Initialize the class so that the data is in a known state. | * Initialize the class so that the data is in a known state. | ||||
* @access public | * @access public | ||||
* @return void | * @return void | ||||
*/ | */ | ||||
public function __construct() { | public function __construct() { | ||||
$this->smtp_conn = 0; | $this->smtp_conn = 0; | ||||
$this->error = null; | $this->error = null; | ||||
$this->helo_rply = null; | $this->helo_rply = null; | ||||
$this->do_debug = 0; | $this->do_debug = 0; | ||||
} | } | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
// CONNECTION FUNCTIONS | // CONNECTION FUNCTIONS | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
/** | /** | ||||
* Connect to the server specified on the port specified. | * Connect to the server specified on the port specified. | ||||
* If the port is not specified use the default SMTP_PORT. | * If the port is not specified use the default SMTP_PORT. | ||||
* If tval is specified then a connection will try and be | * If tval is specified then a connection will try and be | ||||
* established with the server for that number of seconds. | * established with the server for that number of seconds. | ||||
* If tval is not specified the default is 30 seconds to | * If tval is not specified the default is 30 seconds to | ||||
* try on the connection. | * try on the connection. | ||||
* | * | ||||
* SMTP CODE SUCCESS: 220 | * SMTP CODE SUCCESS: 220 | ||||
* SMTP CODE FAILURE: 421 | * SMTP CODE FAILURE: 421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Connect($host, $port = 0, $tval = 30) { | public function Connect($host, $port = 0, $tval = 30) { | ||||
// set the error val to null so there is no confusion | // set the error val to null so there is no confusion | ||||
$this->error = null; | $this->error = null; | ||||
// make sure we are __not__ connected | // make sure we are __not__ connected | ||||
if($this->connected()) { | if($this->connected()) { | ||||
// already connected, generate error | // already connected, generate error | ||||
$this->error = array("error" => "Already connected to a server"); | $this->error = array("error" => "Already connected to a server"); | ||||
return false; | return false; | ||||
} | } | ||||
if(empty($port)) { | if(empty($port)) { | ||||
$port = $this->SMTP_PORT; | $port = $this->SMTP_PORT; | ||||
} | } | ||||
// connect to the smtp server | // connect to the smtp server | ||||
$this->smtp_conn = @fsockopen($host, // the host of the server | $this->smtp_conn = @fsockopen($host, // the host of the server | ||||
$port, // the port to use | $port, // the port to use | ||||
$errno, // error number if any | $errno, // error number if any | ||||
$errstr, // error message if any | $errstr, // error message if any | ||||
$tval); // give up after ? secs | $tval); // give up after ? secs | ||||
// verify we connected properly | // verify we connected properly | ||||
if(empty($this->smtp_conn)) { | if(empty($this->smtp_conn)) { | ||||
$this->error = array("error" => "Failed to connect to server", | $this->error = array("error" => "Failed to connect to server", | ||||
"errno" => $errno, | "errno" => $errno, | ||||
"errstr" => $errstr); | "errstr" => $errstr); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
// SMTP server can take longer to respond, give longer timeout for first read | // SMTP server can take longer to respond, give longer timeout for first read | ||||
// Windows does not have support for this timeout function | // Windows does not have support for this timeout function | ||||
if(substr(PHP_OS, 0, 3) != "WIN") | if(substr(PHP_OS, 0, 3) != "WIN") | ||||
socket_set_timeout($this->smtp_conn, $tval, 0); | socket_set_timeout($this->smtp_conn, $tval, 0); | ||||
// get any announcement | // get any announcement | ||||
$announce = $this->get_lines(); | $announce = $this->get_lines(); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />'; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Initiate a TLS communication with the server. | * Initiate a TLS communication with the server. | ||||
* | * | ||||
* SMTP CODE 220 Ready to start TLS | * SMTP CODE 220 Ready to start TLS | ||||
* SMTP CODE 501 Syntax error (no parameters allowed) | * SMTP CODE 501 Syntax error (no parameters allowed) | ||||
* SMTP CODE 454 TLS not available due to temporary reason | * SMTP CODE 454 TLS not available due to temporary reason | ||||
* @access public | * @access public | ||||
* @return bool success | * @return bool success | ||||
*/ | */ | ||||
public function StartTLS() { | public function StartTLS() { | ||||
$this->error = null; # to avoid confusion | $this->error = null; # to avoid confusion | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array("error" => "Called StartTLS() without being connected"); | $this->error = array("error" => "Called StartTLS() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); | fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 220) { | if($code != 220) { | ||||
$this->error = | $this->error = | ||||
array("error" => "STARTTLS not accepted from server", | array("error" => "STARTTLS not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
// Begin encrypted connection | // Begin encrypted connection | ||||
if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { | if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Performs SMTP authentication. Must be run after running the | * Performs SMTP authentication. Must be run after running the | ||||
* Hello() method. Returns true if successfully authenticated. | * Hello() method. Returns true if successfully authenticated. | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Authenticate($username, $password) { | public function Authenticate($username, $password) { | ||||
// Start authentication | // Start authentication | ||||
fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); | fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($code != 334) { | if($code != 334) { | ||||
$this->error = | $this->error = | ||||
array("error" => "AUTH not accepted from server", | array("error" => "AUTH not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
// Send encoded username | // Send encoded username | ||||
fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); | fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($code != 334) { | if($code != 334) { | ||||
$this->error = | $this->error = | ||||
array("error" => "Username not accepted from server", | array("error" => "Username not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
// Send encoded password | // Send encoded password | ||||
fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); | fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($code != 235) { | if($code != 235) { | ||||
$this->error = | $this->error = | ||||
array("error" => "Password not accepted from server", | array("error" => "Password not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Returns true if connected to a server otherwise false | * Returns true if connected to a server otherwise false | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Connected() { | public function Connected() { | ||||
if(!empty($this->smtp_conn)) { | if(!empty($this->smtp_conn)) { | ||||
$sock_status = socket_get_status($this->smtp_conn); | $sock_status = socket_get_status($this->smtp_conn); | ||||
if($sock_status["eof"]) { | if($sock_status["eof"]) { | ||||
// the socket is valid but we are not connected | // the socket is valid but we are not connected | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected"; | echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected"; | ||||
} | } | ||||
$this->Close(); | $this->Close(); | ||||
return false; | return false; | ||||
} | } | ||||
return true; // everything looks good | return true; // everything looks good | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | /** | ||||
* Closes the socket and cleans up the state of the class. | * Closes the socket and cleans up the state of the class. | ||||
* It is not considered good to use this function without | * It is not considered good to use this function without | ||||
* first trying to use QUIT. | * first trying to use QUIT. | ||||
* @access public | * @access public | ||||
* @return void | * @return void | ||||
*/ | */ | ||||
public function Close() { | public function Close() { | ||||
$this->error = null; // so there is no confusion | $this->error = null; // so there is no confusion | ||||
$this->helo_rply = null; | $this->helo_rply = null; | ||||
if(!empty($this->smtp_conn)) { | if(!empty($this->smtp_conn)) { | ||||
// close the connection and cleanup | // close the connection and cleanup | ||||
fclose($this->smtp_conn); | fclose($this->smtp_conn); | ||||
$this->smtp_conn = 0; | $this->smtp_conn = 0; | ||||
} | } | ||||
} | } | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
// SMTP COMMANDS | // SMTP COMMANDS | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
/** | /** | ||||
* Issues a data command and sends the msg_data to the server | * Issues a data command and sends the msg_data to the server | ||||
* finializing the mail transaction. $msg_data is the message | * finializing the mail transaction. $msg_data is the message | ||||
* that is to be send with the headers. Each header needs to be | * that is to be send with the headers. Each header needs to be | ||||
* on a single line followed by a <CRLF> with the message headers | * on a single line followed by a <CRLF> with the message headers | ||||
* and the message body being seperated by and additional <CRLF>. | * and the message body being seperated by and additional <CRLF>. | ||||
* | * | ||||
* Implements rfc 821: DATA <CRLF> | * Implements rfc 821: DATA <CRLF> | ||||
* | * | ||||
* SMTP CODE INTERMEDIATE: 354 | * SMTP CODE INTERMEDIATE: 354 | ||||
* [data] | * [data] | ||||
* <CRLF>.<CRLF> | * <CRLF>.<CRLF> | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE FAILURE: 552,554,451,452 | * SMTP CODE FAILURE: 552,554,451,452 | ||||
* SMTP CODE FAILURE: 451,554 | * SMTP CODE FAILURE: 451,554 | ||||
* SMTP CODE ERROR : 500,501,503,421 | * SMTP CODE ERROR : 500,501,503,421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Data($msg_data) { | public function Data($msg_data) { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Data() without being connected"); | "error" => "Called Data() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
fputs($this->smtp_conn,"DATA" . $this->CRLF); | fputs($this->smtp_conn,"DATA" . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 354) { | if($code != 354) { | ||||
$this->error = | $this->error = | ||||
array("error" => "DATA command not accepted from server", | array("error" => "DATA command not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/* the server is ready to accept data! | /* the server is ready to accept data! | ||||
* according to rfc 821 we should not send more than 1000 | * according to rfc 821 we should not send more than 1000 | ||||
* including the CRLF | * including the CRLF | ||||
* characters on a single line so we will break the data up | * 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 | * into lines by \r and/or \n then if needed we will break | ||||
* each of those into smaller lines to fit within the limit. | * each of those into smaller lines to fit within the limit. | ||||
* in addition we will be looking for lines that start with | * in addition we will be looking for lines that start with | ||||
* a period '.' and append and additional period '.' to that | * a period '.' and append and additional period '.' to that | ||||
* line. NOTE: this does not count towards limit. | * line. NOTE: this does not count towards limit. | ||||
*/ | */ | ||||
// normalize the line breaks so we know the explode works | // 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","\n",$msg_data); | ||||
$msg_data = str_replace("\r","\n",$msg_data); | $msg_data = str_replace("\r","\n",$msg_data); | ||||
$lines = explode("\n",$msg_data); | $lines = explode("\n",$msg_data); | ||||
/* we need to find a good way to determine is headers are | /* we need to find a good way to determine is headers are | ||||
* in the msg_data or if it is a straight msg body | * in the msg_data or if it is a straight msg body | ||||
* currently I am assuming rfc 822 definitions of msg headers | * currently I am assuming rfc 822 definitions of msg headers | ||||
* and if the first field of the first line (':' sperated) | * and if the first field of the first line (':' sperated) | ||||
* does not contain a space then it _should_ be a header | * does not contain a space then it _should_ be a header | ||||
* and we can process all lines before a blank "" line as | * and we can process all lines before a blank "" line as | ||||
* headers. | * headers. | ||||
*/ | */ | ||||
$field = substr($lines[0],0,strpos($lines[0],":")); | $field = substr($lines[0],0,strpos($lines[0],":")); | ||||
$in_headers = false; | $in_headers = false; | ||||
if(!empty($field) && !strstr($field," ")) { | if(!empty($field) && !strstr($field," ")) { | ||||
$in_headers = true; | $in_headers = true; | ||||
} | } | ||||
$max_line_length = 998; // used below; set here for ease in change | $max_line_length = 998; // used below; set here for ease in change | ||||
while(list(,$line) = @each($lines)) { | foreach($lines as $line) { | ||||
$lines_out = null; | $lines_out = null; | ||||
if($line == "" && $in_headers) { | if($line == "" && $in_headers) { | ||||
$in_headers = false; | $in_headers = false; | ||||
} | } | ||||
// ok we need to break this line up into several smaller lines | // ok we need to break this line up into several smaller lines | ||||
while(strlen($line) > $max_line_length) { | while(strlen($line) > $max_line_length) { | ||||
$pos = strrpos(substr($line,0,$max_line_length)," "); | $pos = strrpos(substr($line,0,$max_line_length)," "); | ||||
// Patch to fix DOS attack | // Patch to fix DOS attack | ||||
if(!$pos) { | if(!$pos) { | ||||
$pos = $max_line_length - 1; | $pos = $max_line_length - 1; | ||||
$lines_out[] = substr($line,0,$pos); | $lines_out[] = substr($line,0,$pos); | ||||
$line = substr($line,$pos); | $line = substr($line,$pos); | ||||
} else { | } else { | ||||
$lines_out[] = substr($line,0,$pos); | $lines_out[] = substr($line,0,$pos); | ||||
$line = substr($line,$pos + 1); | $line = substr($line,$pos + 1); | ||||
} | } | ||||
/* if processing headers add a LWSP-char to the front of new line | /* if processing headers add a LWSP-char to the front of new line | ||||
* rfc 822 on long msg headers | * rfc 822 on long msg headers | ||||
*/ | */ | ||||
if($in_headers) { | if($in_headers) { | ||||
$line = "\t" . $line; | $line = "\t" . $line; | ||||
} | } | ||||
} | } | ||||
$lines_out[] = $line; | $lines_out[] = $line; | ||||
// send the lines to the server | // send the lines to the server | ||||
while(list(,$line_out) = @each($lines_out)) { | foreach($lines_out as $line_out) { | ||||
if(strlen($line_out) > 0) | if(strlen($line_out) > 0) | ||||
{ | { | ||||
if(substr($line_out, 0, 1) == ".") { | if(substr($line_out, 0, 1) == ".") { | ||||
$line_out = "." . $line_out; | $line_out = "." . $line_out; | ||||
} | } | ||||
} | } | ||||
fputs($this->smtp_conn,$line_out . $this->CRLF); | fputs($this->smtp_conn,$line_out . $this->CRLF); | ||||
} | } | ||||
} | } | ||||
// message data has been sent | // message data has been sent | ||||
fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); | fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250) { | if($code != 250) { | ||||
$this->error = | $this->error = | ||||
array("error" => "DATA not accepted from server", | array("error" => "DATA not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Sends the HELO command to the smtp server. | * Sends the HELO command to the smtp server. | ||||
* This makes sure that we and the server are in | * This makes sure that we and the server are in | ||||
* the same known state. | * the same known state. | ||||
* | * | ||||
* Implements from rfc 821: HELO <SP> <domain> <CRLF> | * Implements from rfc 821: HELO <SP> <domain> <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE ERROR : 500, 501, 504, 421 | * SMTP CODE ERROR : 500, 501, 504, 421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Hello($host = '') { | public function Hello($host = '') { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Hello() without being connected"); | "error" => "Called Hello() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
// if hostname for HELO was not specified send default | // if hostname for HELO was not specified send default | ||||
if(empty($host)) { | if(empty($host)) { | ||||
// determine appropriate default to send to server | // determine appropriate default to send to server | ||||
$host = "localhost"; | $host = "localhost"; | ||||
} | } | ||||
// Send extended hello first (RFC 2821) | // Send extended hello first (RFC 2821) | ||||
if(!$this->SendHello("EHLO", $host)) { | if(!$this->SendHello("EHLO", $host)) { | ||||
if(!$this->SendHello("HELO", $host)) { | if(!$this->SendHello("HELO", $host)) { | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Sends a HELO/EHLO command. | * Sends a HELO/EHLO command. | ||||
* @access private | * @access private | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
private function SendHello($hello, $host) { | private function SendHello($hello, $host) { | ||||
fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); | fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250) { | if($code != 250) { | ||||
$this->error = | $this->error = | ||||
array("error" => $hello . " not accepted from server", | array("error" => $hello . " not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
$this->helo_rply = $rply; | $this->helo_rply = $rply; | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Starts a mail transaction from the email address specified in | * Starts a mail transaction from the email address specified in | ||||
* $from. Returns true if successful or false otherwise. If True | * $from. Returns true if successful or false otherwise. If True | ||||
* the mail transaction is started and then one or more Recipient | * the mail transaction is started and then one or more Recipient | ||||
* commands may be called followed by a Data command. | * commands may be called followed by a Data command. | ||||
* | * | ||||
* Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> | * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE SUCCESS: 552,451,452 | * SMTP CODE SUCCESS: 552,451,452 | ||||
* SMTP CODE SUCCESS: 500,501,421 | * SMTP CODE SUCCESS: 500,501,421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Mail($from) { | public function Mail($from) { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Mail() without being connected"); | "error" => "Called Mail() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
$useVerp = ($this->do_verp ? "XVERP" : ""); | $useVerp = ($this->do_verp ? "XVERP" : ""); | ||||
fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); | fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250) { | if($code != 250) { | ||||
$this->error = | $this->error = | ||||
array("error" => "MAIL not accepted from server", | array("error" => "MAIL not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Sends the quit command to the server and then closes the socket | * Sends the quit command to the server and then closes the socket | ||||
* if there is no error or the $close_on_error argument is true. | * if there is no error or the $close_on_error argument is true. | ||||
* | * | ||||
* Implements from rfc 821: QUIT <CRLF> | * Implements from rfc 821: QUIT <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 221 | * SMTP CODE SUCCESS: 221 | ||||
* SMTP CODE ERROR : 500 | * SMTP CODE ERROR : 500 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Quit($close_on_error = true) { | public function Quit($close_on_error = true) { | ||||
$this->error = null; // so there is no confusion | $this->error = null; // so there is no confusion | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Quit() without being connected"); | "error" => "Called Quit() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
// send the quit command to the server | // send the quit command to the server | ||||
fputs($this->smtp_conn,"quit" . $this->CRLF); | fputs($this->smtp_conn,"quit" . $this->CRLF); | ||||
// get any good-bye messages | // get any good-bye messages | ||||
$byemsg = $this->get_lines(); | $byemsg = $this->get_lines(); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />'; | ||||
} | } | ||||
$rval = true; | $rval = true; | ||||
$e = null; | $e = null; | ||||
$code = substr($byemsg,0,3); | $code = substr($byemsg,0,3); | ||||
if($code != 221) { | if($code != 221) { | ||||
// use e as a tmp var cause Close will overwrite $this->error | // use e as a tmp var cause Close will overwrite $this->error | ||||
$e = array("error" => "SMTP server rejected quit command", | $e = array("error" => "SMTP server rejected quit command", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_rply" => substr($byemsg,4)); | "smtp_rply" => substr($byemsg,4)); | ||||
$rval = false; | $rval = false; | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />'; | ||||
} | } | ||||
} | } | ||||
if(empty($e) || $close_on_error) { | if(empty($e) || $close_on_error) { | ||||
$this->Close(); | $this->Close(); | ||||
} | } | ||||
return $rval; | return $rval; | ||||
} | } | ||||
/** | /** | ||||
* Sends the command RCPT to the SMTP server with the TO: argument of $to. | * Sends the command RCPT to the SMTP server with the TO: argument of $to. | ||||
* Returns true if the recipient was accepted false if it was rejected. | * Returns true if the recipient was accepted false if it was rejected. | ||||
* | * | ||||
* Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> | * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250,251 | * SMTP CODE SUCCESS: 250,251 | ||||
* SMTP CODE FAILURE: 550,551,552,553,450,451,452 | * SMTP CODE FAILURE: 550,551,552,553,450,451,452 | ||||
* SMTP CODE ERROR : 500,501,503,421 | * SMTP CODE ERROR : 500,501,503,421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Recipient($to) { | public function Recipient($to) { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Recipient() without being connected"); | "error" => "Called Recipient() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); | fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250 && $code != 251) { | if($code != 250 && $code != 251) { | ||||
$this->error = | $this->error = | ||||
array("error" => "RCPT not accepted from server", | array("error" => "RCPT not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Sends the RSET command to abort and transaction that is | * Sends the RSET command to abort and transaction that is | ||||
* currently in progress. Returns true if successful false | * currently in progress. Returns true if successful false | ||||
* otherwise. | * otherwise. | ||||
* | * | ||||
* Implements rfc 821: RSET <CRLF> | * Implements rfc 821: RSET <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE ERROR : 500,501,504,421 | * SMTP CODE ERROR : 500,501,504,421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Reset() { | public function Reset() { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called Reset() without being connected"); | "error" => "Called Reset() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
fputs($this->smtp_conn,"RSET" . $this->CRLF); | fputs($this->smtp_conn,"RSET" . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250) { | if($code != 250) { | ||||
$this->error = | $this->error = | ||||
array("error" => "RSET failed", | array("error" => "RSET failed", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* Starts a mail transaction from the email address specified in | * Starts a mail transaction from the email address specified in | ||||
* $from. Returns true if successful or false otherwise. If True | * $from. Returns true if successful or false otherwise. If True | ||||
* the mail transaction is started and then one or more Recipient | * the mail transaction is started and then one or more Recipient | ||||
* commands may be called followed by a Data command. This command | * commands may be called followed by a Data command. This command | ||||
* will send the message to the users terminal if they are logged | * will send the message to the users terminal if they are logged | ||||
* in and send them an email. | * in and send them an email. | ||||
* | * | ||||
* Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> | * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE SUCCESS: 552,451,452 | * SMTP CODE SUCCESS: 552,451,452 | ||||
* SMTP CODE SUCCESS: 500,501,502,421 | * SMTP CODE SUCCESS: 500,501,502,421 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function SendAndMail($from) { | public function SendAndMail($from) { | ||||
$this->error = null; // so no confusion is caused | $this->error = null; // so no confusion is caused | ||||
if(!$this->connected()) { | if(!$this->connected()) { | ||||
$this->error = array( | $this->error = array( | ||||
"error" => "Called SendAndMail() without being connected"); | "error" => "Called SendAndMail() without being connected"); | ||||
return false; | return false; | ||||
} | } | ||||
fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); | fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); | ||||
$rply = $this->get_lines(); | $rply = $this->get_lines(); | ||||
$code = substr($rply,0,3); | $code = substr($rply,0,3); | ||||
if($this->do_debug >= 2) { | if($this->do_debug >= 2) { | ||||
echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
if($code != 250) { | if($code != 250) { | ||||
$this->error = | $this->error = | ||||
array("error" => "SAML not accepted from server", | array("error" => "SAML not accepted from server", | ||||
"smtp_code" => $code, | "smtp_code" => $code, | ||||
"smtp_msg" => substr($rply,4)); | "smtp_msg" => substr($rply,4)); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
/** | /** | ||||
* This is an optional command for SMTP that this class does not | * This is an optional command for SMTP that this class does not | ||||
* support. This method is here to make the RFC821 Definition | * support. This method is here to make the RFC821 Definition | ||||
* complete for this class and __may__ be implimented in the future | * complete for this class and __may__ be implimented in the future | ||||
* | * | ||||
* Implements from rfc 821: TURN <CRLF> | * Implements from rfc 821: TURN <CRLF> | ||||
* | * | ||||
* SMTP CODE SUCCESS: 250 | * SMTP CODE SUCCESS: 250 | ||||
* SMTP CODE FAILURE: 502 | * SMTP CODE FAILURE: 502 | ||||
* SMTP CODE ERROR : 500, 503 | * SMTP CODE ERROR : 500, 503 | ||||
* @access public | * @access public | ||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
public function Turn() { | public function Turn() { | ||||
$this->error = array("error" => "This method, TURN, of the SMTP ". | $this->error = array("error" => "This method, TURN, of the SMTP ". | ||||
"is not implemented"); | "is not implemented"); | ||||
if($this->do_debug >= 1) { | if($this->do_debug >= 1) { | ||||
echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />'; | echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />'; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | /** | ||||
* Get the current error | * Get the current error | ||||
* @access public | * @access public | ||||
* @return array | * @return array | ||||
*/ | */ | ||||
public function getError() { | public function getError() { | ||||
return $this->error; | return $this->error; | ||||
} | } | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
// INTERNAL FUNCTIONS | // INTERNAL FUNCTIONS | ||||
///////////////////////////////////////////////// | ///////////////////////////////////////////////// | ||||
/** | /** | ||||
* Read in as many lines as possible | * Read in as many lines as possible | ||||
* either before eof or socket timeout occurs on the operation. | * either before eof or socket timeout occurs on the operation. | ||||
* With SMTP we can tell if we have more lines to read if the | * With SMTP we can tell if we have more lines to read if the | ||||
* 4th character is '-' symbol. If it is a space then we don't | * 4th character is '-' symbol. If it is a space then we don't | ||||
* need to read anything else. | * need to read anything else. | ||||
* @access private | * @access private | ||||
* @return string | * @return string | ||||
*/ | */ | ||||
private function get_lines() { | private function get_lines() { | ||||
$data = ""; | $data = ""; | ||||
while($str = @fgets($this->smtp_conn,515)) { | while($str = @fgets($this->smtp_conn,515)) { | ||||
if($this->do_debug >= 4) { | if($this->do_debug >= 4) { | ||||
echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />'; | echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />'; | ||||
echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />'; | echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />'; | ||||
} | } | ||||
$data .= $str; | $data .= $str; | ||||
if($this->do_debug >= 4) { | if($this->do_debug >= 4) { | ||||
echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />'; | echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />'; | ||||
} | } | ||||
// if 4th character is a space, we are done reading, break the loop | // if 4th character is a space, we are done reading, break the loop | ||||
if(substr($str,3,1) == " ") { break; } | if(substr($str,3,1) == " ") { break; } | ||||
} | } | ||||
return $data; | return $data; | ||||
} | } | ||||
} | } | ||||
?> | ?> | ||||
No newline at end of file |
Content licensed under Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA) unless otherwise noted; code licensed under Apache 2.0 or other open source licenses. · CC BY-SA 4.0 · Apache 2.0