File: 1.08.0a/server/base/phpmailer/class.smtp.php (View as Code)

1: 2: /*~ class.smtp.php 3: .---------------------------------------------------------------------------. 4: | Software: PHPMailer - PHP email class | 5: | Version: 5.0.0 | 6: | Contact: via sourceforge.net support pages (also www.codeworxtech.com) | 7: | Info: http://phpmailer.sourceforge.net | 8: | Support: http://sourceforge.net/projects/phpmailer/ | 9: | ------------------------------------------------------------------------- | 10: | Admin: Andy Prevost (project admininistrator) | 11: | Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net | 12: | : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | 13: | Founder: Brent R. Matzelle (original founder) | 14: | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | 15: | Copyright (c) 2001-2003, Brent R. Matzelle | 16: | ------------------------------------------------------------------------- | 17: | License: Distributed under the Lesser General Public License (LGPL) | 18: | http://www.gnu.org/copyleft/lesser.html | 19: | This program is distributed in the hope that it will be useful - WITHOUT | 20: | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 21: | FITNESS FOR A PARTICULAR PURPOSE. | 22: | ------------------------------------------------------------------------- | 23: | We offer a number of paid services (www.codeworxtech.com): | 24: | - Web Hosting on highly optimized fast and secure servers | 25: | - Technology Consulting | 26: | - Oursourcing (highly qualified programmers and graphic designers) | 27: '---------------------------------------------------------------------------' 28: */ 29: 30: /** 31: * PHPMailer - PHP SMTP email transport class 32: * NOTE: Designed for use with PHP version 5 and up 33: * @package PHPMailer 34: * @author Andy Prevost 35: * @author Marcus Bointon 36: * @copyright 2004 - 2008 Andy Prevost 37: * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL) 38: * @version $Id: class.smtp.php 240 2009-03-31 04:40:33Z codeworxtech $ 39: */ 40: 41: /** 42: * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP 43: * commands except TURN which will always return a not implemented 44: * error. SMTP also provides some utility methods for sending mail 45: * to an SMTP server. 46: * original author: Chris Ryan 47: */ 48: 49: class SMTP { 50: /** 51: * SMTP server port 52: * @var int 53: */ 54: public $SMTP_PORT = 25; 55: 56: /** 57: * SMTP reply line ending 58: * @var string 59: */ 60: public $CRLF = "\r\n"; 61: 62: /** 63: * Sets whether debugging is turned on 64: * @var bool 65: */ 66: public $do_debug; // the level of debug to perform 67: 68: /** 69: * Sets VERP use on/off (default is off) 70: * @var bool 71: */ 72: public $do_verp = false; 73: 74: ///////////////////////////////////////////////// 75: // PROPERTIES, PRIVATE AND PROTECTED 76: ///////////////////////////////////////////////// 77: 78: private $smtp_conn; // the socket to the server 79: private $error; // error if any on the last call 80: private $helo_rply; // the reply the server sent to us for HELO 81: 82: /** 83: * Initialize the class so that the data is in a known state. 84: * @access public 85: * @return void 86: */ 87: public function __construct() { 88: $this->smtp_conn = 0; 89: $this->error = null; 90: $this->helo_rply = null; 91: 92: $this->do_debug = 0; 93: } 94: 95: ///////////////////////////////////////////////// 96: // CONNECTION FUNCTIONS 97: ///////////////////////////////////////////////// 98: 99: /** 100: * Connect to the server specified on the port specified. 101: * If the port is not specified use the default SMTP_PORT. 102: * If tval is specified then a connection will try and be 103: * established with the server for that number of seconds. 104: * If tval is not specified the default is 30 seconds to 105: * try on the connection. 106: * 107: * SMTP CODE SUCCESS: 220 108: * SMTP CODE FAILURE: 421 109: * @access public 110: * @return bool 111: */ 112: public function Connect($host, $port = 0, $tval = 30) { 113: // set the error val to null so there is no confusion 114: $this->error = null; 115: 116: // make sure we are __not__ connected 117: if($this->connected()) { 118: // already connected, generate error 119: $this->error = array("error" => "Already connected to a server"); 120: return false; 121: } 122: 123: if(empty($port)) { 124: $port = $this->SMTP_PORT; 125: } 126: 127: // connect to the smtp server 128: $this->smtp_conn = @fsockopen($host, // the host of the server 129: $port, // the port to use 130: $errno, // error number if any 131: $errstr, // error message if any 132: $tval); // give up after ? secs 133: // verify we connected properly 134: if(empty($this->smtp_conn)) { 135: $this->error = array("error" => "Failed to connect to server", 136: "errno" => $errno, 137: "errstr" => $errstr); 138: if($this->do_debug >= 1) { 139: echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '
';
140: } 141: return false; 142: } 143: 144: // SMTP server can take longer to respond, give longer timeout for first read 145: // Windows does not have support for this timeout function 146: if(substr(PHP_OS, 0, 3) != "WIN") 147: socket_set_timeout($this->smtp_conn, $tval, 0); 148: 149: // get any announcement 150: $announce = $this->get_lines(); 151: 152: if($this->do_debug >= 2) { 153: echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '
';
154: } 155: 156: return true; 157: } 158: 159: /** 160: * Initiate a TLS communication with the server. 161: * 162: * SMTP CODE 220 Ready to start TLS 163: * SMTP CODE 501 Syntax error (no parameters allowed) 164: * SMTP CODE 454 TLS not available due to temporary reason 165: * @access public 166: * @return bool success 167: */ 168: public function StartTLS() { 169: $this->error = null; # to avoid confusion 170: 171: if(!$this->connected()) { 172: $this->error = array("error" => "Called StartTLS() without being connected"); 173: return false; 174: } 175: 176: fputs($this->smtp_conn,"STARTTLS" . $this->CRLF); 177: 178: $rply = $this->get_lines(); 179: $code = substr($rply,0,3); 180: 181: if($this->do_debug >= 2) { 182: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
183: } 184: 185: if($code != 220) { 186: $this->error = 187: array("error" => "STARTTLS not accepted from server", 188: "smtp_code" => $code, 189: "smtp_msg" => substr($rply,4)); 190: if($this->do_debug >= 1) { 191: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
192: } 193: return false; 194: } 195: 196: // Begin encrypted connection 197: if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { 198: return false; 199: } 200: 201: return true; 202: } 203: 204: /** 205: * Performs SMTP authentication. Must be run after running the 206: * Hello() method. Returns true if successfully authenticated. 207: * @access public 208: * @return bool 209: */ 210: public function Authenticate($username, $password) { 211: // Start authentication 212: fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); 213: 214: $rply = $this->get_lines(); 215: $code = substr($rply,0,3); 216: 217: if($code != 334) { 218: $this->error = 219: array("error" => "AUTH not accepted from server", 220: "smtp_code" => $code, 221: "smtp_msg" => substr($rply,4)); 222: if($this->do_debug >= 1) { 223: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
224: } 225: return false; 226: } 227: 228: // Send encoded username 229: fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); 230: 231: $rply = $this->get_lines(); 232: $code = substr($rply,0,3); 233: 234: if($code != 334) { 235: $this->error = 236: array("error" => "Username not accepted from server", 237: "smtp_code" => $code, 238: "smtp_msg" => substr($rply,4)); 239: if($this->do_debug >= 1) { 240: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
241: } 242: return false; 243: } 244: 245: // Send encoded password 246: fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); 247: 248: $rply = $this->get_lines(); 249: $code = substr($rply,0,3); 250: 251: if($code != 235) { 252: $this->error = 253: array("error" => "Password not accepted from server", 254: "smtp_code" => $code, 255: "smtp_msg" => substr($rply,4)); 256: if($this->do_debug >= 1) { 257: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
258: } 259: return false; 260: } 261: 262: return true; 263: } 264: 265: /** 266: * Returns true if connected to a server otherwise false 267: * @access public 268: * @return bool 269: */ 270: public function Connected() { 271: if(!empty($this->smtp_conn)) { 272: $sock_status = socket_get_status($this->smtp_conn); 273: if($sock_status["eof"]) { 274: // the socket is valid but we are not connected 275: if($this->do_debug >= 1) { 276: echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected"; 277: } 278: $this->Close(); 279: return false; 280: } 281: return true; // everything looks good 282: } 283: return false; 284: } 285: 286: /** 287: * Closes the socket and cleans up the state of the class. 288: * It is not considered good to use this function without 289: * first trying to use QUIT. 290: * @access public 291: * @return void 292: */ 293: public function Close() { 294: $this->error = null; // so there is no confusion 295: $this->helo_rply = null; 296: if(!empty($this->smtp_conn)) { 297: // close the connection and cleanup 298: fclose($this->smtp_conn); 299: $this->smtp_conn = 0; 300: } 301: } 302: 303: ///////////////////////////////////////////////// 304: // SMTP COMMANDS 305: ///////////////////////////////////////////////// 306: 307: /** 308: * Issues a data command and sends the msg_data to the server 309: * finializing the mail transaction. $msg_data is the message 310: * that is to be send with the headers. Each header needs to be 311: * on a single line followed by a with the message headers 312: * and the message body being seperated by and additional . 313: * 314: * Implements rfc 821: DATA 315: * 316: * SMTP CODE INTERMEDIATE: 354 317: * [data] 318: * . 319: * SMTP CODE SUCCESS: 250 320: * SMTP CODE FAILURE: 552,554,451,452 321: * SMTP CODE FAILURE: 451,554 322: * SMTP CODE ERROR : 500,501,503,421 323: * @access public 324: * @return bool 325: */ 326: public function Data($msg_data) { 327: $this->error = null; // so no confusion is caused 328: 329: if(!$this->connected()) { 330: $this->error = array( 331: "error" => "Called Data() without being connected"); 332: return false; 333: } 334: 335: fputs($this->smtp_conn,"DATA" . $this->CRLF); 336: 337: $rply = $this->get_lines(); 338: $code = substr($rply,0,3); 339: 340: if($this->do_debug >= 2) { 341: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
342: } 343: 344: if($code != 354) { 345: $this->error = 346: array("error" => "DATA command not accepted from server", 347: "smtp_code" => $code, 348: "smtp_msg" => substr($rply,4)); 349: if($this->do_debug >= 1) { 350: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
351: } 352: return false; 353: } 354: 355: /* the server is ready to accept data! 356: * according to rfc 821 we should not send more than 1000 357: * including the CRLF 358: * characters on a single line so we will break the data up 359: * into lines by \r and/or \n then if needed we will break 360: * each of those into smaller lines to fit within the limit. 361: * in addition we will be looking for lines that start with 362: * a period '.' and append and additional period '.' to that 363: * line. NOTE: this does not count towards limit. 364: */ 365: 366: // normalize the line breaks so we know the explode works 367: $msg_data = str_replace("\r\n","\n",$msg_data); 368: $msg_data = str_replace("\r","\n",$msg_data); 369: $lines = explode("\n",$msg_data); 370: 371: /* we need to find a good way to determine is headers are 372: * in the msg_data or if it is a straight msg body 373: * currently I am assuming rfc 822 definitions of msg headers 374: * and if the first field of the first line (':' sperated) 375: * does not contain a space then it _should_ be a header 376: * and we can process all lines before a blank "" line as 377: * headers. 378: */ 379: 380: $field = substr($lines[0],0,strpos($lines[0],":")); 381: $in_headers = false; 382: if(!empty($field) && !strstr($field," ")) { 383: $in_headers = true; 384: } 385: 386: $max_line_length = 998; // used below; set here for ease in change 387: 388: while(list(,$line) = @each($lines)) { 389: $lines_out = null; 390: if($line == "" && $in_headers) { 391: $in_headers = false; 392: } 393: // ok we need to break this line up into several smaller lines 394: while(strlen($line) > $max_line_length) { 395: $pos = strrpos(substr($line,0,$max_line_length)," "); 396: 397: // Patch to fix DOS attack 398: if(!$pos) { 399: $pos = $max_line_length - 1; 400: $lines_out[] = substr($line,0,$pos); 401: $line = substr($line,$pos); 402: } else { 403: $lines_out[] = substr($line,0,$pos); 404: $line = substr($line,$pos + 1); 405: } 406: 407: /* if processing headers add a LWSP-char to the front of new line 408: * rfc 822 on long msg headers 409: */ 410: if($in_headers) { 411: $line = "\t" . $line; 412: } 413: } 414: $lines_out[] = $line; 415: 416: // send the lines to the server 417: while(list(,$line_out) = @each($lines_out)) { 418: if(strlen($line_out) > 0) 419: { 420: if(substr($line_out, 0, 1) == ".") { 421: $line_out = "." . $line_out; 422: } 423: } 424: fputs($this->smtp_conn,$line_out . $this->CRLF); 425: } 426: } 427: 428: // message data has been sent 429: fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); 430: 431: $rply = $this->get_lines(); 432: $code = substr($rply,0,3); 433: 434: if($this->do_debug >= 2) { 435: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
436: } 437: 438: if($code != 250) { 439: $this->error = 440: array("error" => "DATA not accepted from server", 441: "smtp_code" => $code, 442: "smtp_msg" => substr($rply,4)); 443: if($this->do_debug >= 1) { 444: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
445: } 446: return false; 447: } 448: return true; 449: } 450: 451: /** 452: * Sends the HELO command to the smtp server. 453: * This makes sure that we and the server are in 454: * the same known state. 455: * 456: * Implements from rfc 821: HELO 457: * 458: * SMTP CODE SUCCESS: 250 459: * SMTP CODE ERROR : 500, 501, 504, 421 460: * @access public 461: * @return bool 462: */ 463: public function Hello($host = '') { 464: $this->error = null; // so no confusion is caused 465: 466: if(!$this->connected()) { 467: $this->error = array( 468: "error" => "Called Hello() without being connected"); 469: return false; 470: } 471: 472: // if hostname for HELO was not specified send default 473: if(empty($host)) { 474: // determine appropriate default to send to server 475: $host = "localhost"; 476: } 477: 478: // Send extended hello first (RFC 2821) 479: if(!$this->SendHello("EHLO", $host)) { 480: if(!$this->SendHello("HELO", $host)) { 481: return false; 482: } 483: } 484: 485: return true; 486: } 487: 488: /** 489: * Sends a HELO/EHLO command. 490: * @access private 491: * @return bool 492: */ 493: private function SendHello($hello, $host) { 494: fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); 495: 496: $rply = $this->get_lines(); 497: $code = substr($rply,0,3); 498: 499: if($this->do_debug >= 2) { 500: echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '
';
501: } 502: 503: if($code != 250) { 504: $this->error = 505: array("error" => $hello . " not accepted from server", 506: "smtp_code" => $code, 507: "smtp_msg" => substr($rply,4)); 508: if($this->do_debug >= 1) { 509: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
510: } 511: return false; 512: } 513: 514: $this->helo_rply = $rply; 515: 516: return true; 517: } 518: 519: /** 520: * Starts a mail transaction from the email address specified in 521: * $from. Returns true if successful or false otherwise. If True 522: * the mail transaction is started and then one or more Recipient 523: * commands may be called followed by a Data command. 524: * 525: * Implements rfc 821: MAIL FROM: 526: * 527: * SMTP CODE SUCCESS: 250 528: * SMTP CODE SUCCESS: 552,451,452 529: * SMTP CODE SUCCESS: 500,501,421 530: * @access public 531: * @return bool 532: */ 533: public function Mail($from) { 534: $this->error = null; // so no confusion is caused 535: 536: if(!$this->connected()) { 537: $this->error = array( 538: "error" => "Called Mail() without being connected"); 539: return false; 540: } 541: 542: $useVerp = ($this->do_verp ? "XVERP" : ""); 543: fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); 544: 545: $rply = $this->get_lines(); 546: $code = substr($rply,0,3); 547: 548: if($this->do_debug >= 2) { 549: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
550: } 551: 552: if($code != 250) { 553: $this->error = 554: array("error" => "MAIL not accepted from server", 555: "smtp_code" => $code, 556: "smtp_msg" => substr($rply,4)); 557: if($this->do_debug >= 1) { 558: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
559: } 560: return false; 561: } 562: return true; 563: } 564: 565: /** 566: * Sends the quit command to the server and then closes the socket 567: * if there is no error or the $close_on_error argument is true. 568: * 569: * Implements from rfc 821: QUIT 570: * 571: * SMTP CODE SUCCESS: 221 572: * SMTP CODE ERROR : 500 573: * @access public 574: * @return bool 575: */ 576: public function Quit($close_on_error = true) { 577: $this->error = null; // so there is no confusion 578: 579: if(!$this->connected()) { 580: $this->error = array( 581: "error" => "Called Quit() without being connected"); 582: return false; 583: } 584: 585: // send the quit command to the server 586: fputs($this->smtp_conn,"quit" . $this->CRLF); 587: 588: // get any good-bye messages 589: $byemsg = $this->get_lines(); 590: 591: if($this->do_debug >= 2) { 592: echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '
';
593: } 594: 595: $rval = true; 596: $e = null; 597: 598: $code = substr($byemsg,0,3); 599: if($code != 221) { 600: // use e as a tmp var cause Close will overwrite $this->error 601: $e = array("error" => "SMTP server rejected quit command", 602: "smtp_code" => $code, 603: "smtp_rply" => substr($byemsg,4)); 604: $rval = false; 605: if($this->do_debug >= 1) { 606: echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '
';
607: } 608: } 609: 610: if(empty($e) || $close_on_error) { 611: $this->Close(); 612: } 613: 614: return $rval; 615: } 616: 617: /** 618: * Sends the command RCPT to the SMTP server with the TO: argument of $to. 619: * Returns true if the recipient was accepted false if it was rejected. 620: * 621: * Implements from rfc 821: RCPT TO: 622: * 623: * SMTP CODE SUCCESS: 250,251 624: * SMTP CODE FAILURE: 550,551,552,553,450,451,452 625: * SMTP CODE ERROR : 500,501,503,421 626: * @access public 627: * @return bool 628: */ 629: public function Recipient($to) { 630: $this->error = null; // so no confusion is caused 631: 632: if(!$this->connected()) { 633: $this->error = array( 634: "error" => "Called Recipient() without being connected"); 635: return false; 636: } 637: 638: fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); 639: 640: $rply = $this->get_lines(); 641: $code = substr($rply,0,3); 642: 643: if($this->do_debug >= 2) { 644: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
645: } 646: 647: if($code != 250 && $code != 251) { 648: $this->error = 649: array("error" => "RCPT not accepted from server", 650: "smtp_code" => $code, 651: "smtp_msg" => substr($rply,4)); 652: if($this->do_debug >= 1) { 653: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
654: } 655: return false; 656: } 657: return true; 658: } 659: 660: /** 661: * Sends the RSET command to abort and transaction that is 662: * currently in progress. Returns true if successful false 663: * otherwise. 664: * 665: * Implements rfc 821: RSET 666: * 667: * SMTP CODE SUCCESS: 250 668: * SMTP CODE ERROR : 500,501,504,421 669: * @access public 670: * @return bool 671: */ 672: public function Reset() { 673: $this->error = null; // so no confusion is caused 674: 675: if(!$this->connected()) { 676: $this->error = array( 677: "error" => "Called Reset() without being connected"); 678: return false; 679: } 680: 681: fputs($this->smtp_conn,"RSET" . $this->CRLF); 682: 683: $rply = $this->get_lines(); 684: $code = substr($rply,0,3); 685: 686: if($this->do_debug >= 2) { 687: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
688: } 689: 690: if($code != 250) { 691: $this->error = 692: array("error" => "RSET failed", 693: "smtp_code" => $code, 694: "smtp_msg" => substr($rply,4)); 695: if($this->do_debug >= 1) { 696: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
697: } 698: return false; 699: } 700: 701: return true; 702: } 703: 704: /** 705: * Starts a mail transaction from the email address specified in 706: * $from. Returns true if successful or false otherwise. If True 707: * the mail transaction is started and then one or more Recipient 708: * commands may be called followed by a Data command. This command 709: * will send the message to the users terminal if they are logged 710: * in and send them an email. 711: * 712: * Implements rfc 821: SAML FROM: 713: * 714: * SMTP CODE SUCCESS: 250 715: * SMTP CODE SUCCESS: 552,451,452 716: * SMTP CODE SUCCESS: 500,501,502,421 717: * @access public 718: * @return bool 719: */ 720: public function SendAndMail($from) { 721: $this->error = null; // so no confusion is caused 722: 723: if(!$this->connected()) { 724: $this->error = array( 725: "error" => "Called SendAndMail() without being connected"); 726: return false; 727: } 728: 729: fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); 730: 731: $rply = $this->get_lines(); 732: $code = substr($rply,0,3); 733: 734: if($this->do_debug >= 2) { 735: echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '
';
736: } 737: 738: if($code != 250) { 739: $this->error = 740: array("error" => "SAML not accepted from server", 741: "smtp_code" => $code, 742: "smtp_msg" => substr($rply,4)); 743: if($this->do_debug >= 1) { 744: echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '
';
745: } 746: return false; 747: } 748: return true; 749: } 750: 751: /** 752: * This is an optional command for SMTP that this class does not 753: * support. This method is here to make the RFC821 Definition 754: * complete for this class and __may__ be implimented in the future 755: * 756: * Implements from rfc 821: TURN 757: * 758: * SMTP CODE SUCCESS: 250 759: * SMTP CODE FAILURE: 502 760: * SMTP CODE ERROR : 500, 503 761: * @access public 762: * @return bool 763: */ 764: public function Turn() { 765: $this->error = array("error" => "This method, TURN, of the SMTP ". 766: "is not implemented"); 767: if($this->do_debug >= 1) { 768: echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '
';
769: } 770: return false; 771: } 772: 773: /** 774: * Get the current error 775: * @access public 776: * @return array 777: */ 778: public function getError() { 779: return $this->error; 780: } 781: 782: ///////////////////////////////////////////////// 783: // INTERNAL FUNCTIONS 784: ///////////////////////////////////////////////// 785: 786: /** 787: * Read in as many lines as possible 788: * either before eof or socket timeout occurs on the operation. 789: * With SMTP we can tell if we have more lines to read if the 790: * 4th character is '-' symbol. If it is a space then we don't 791: * need to read anything else. 792: * @access private 793: * @return string 794: */ 795: private function get_lines() { 796: $data = ""; 797: while($str = @fgets($this->smtp_conn,515)) { 798: if($this->do_debug >= 4) { 799: echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '
';
800: echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '
';
801: } 802: $data .= $str; 803: if($this->do_debug >= 4) { 804: echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '
';
805: } 806: // if 4th character is a space, we are done reading, break the loop 807: if(substr($str,3,1) == " ") { break; } 808: } 809: return $data; 810: } 811: 812: } 813: 814: ?>