-
+ 5EAB6FD66B7DA79B8F58D432AD77E93FF43C04D06AD37B52D76179B2351A57C581F5592693B1A9B7D9D9A14C2A1C567871A9C9F4E9E1368A8EBE15DB3E03B866
mp-wp/wp-includes/class-smtp.php
(0 . 0)(1 . 1062)
79212 <?php
79213 /*~ class.smtp.php
79214 .---------------------------------------------------------------------------.
79215 | Software: PHPMailer - PHP email class |
79216 | Version: 2.0.2 |
79217 | Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
79218 | Info: http://phpmailer.sourceforge.net |
79219 | Support: http://sourceforge.net/projects/phpmailer/ |
79220 | ------------------------------------------------------------------------- |
79221 | Author: Andy Prevost (project admininistrator) |
79222 | Author: Brent R. Matzelle (original founder) |
79223 | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved. |
79224 | Copyright (c) 2001-2003, Brent R. Matzelle |
79225 | ------------------------------------------------------------------------- |
79226 | License: Distributed under the Lesser General Public License (LGPL) |
79227 | http://www.gnu.org/copyleft/lesser.html |
79228 | This program is distributed in the hope that it will be useful - WITHOUT |
79229 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
79230 | FITNESS FOR A PARTICULAR PURPOSE. |
79231 | ------------------------------------------------------------------------- |
79232 | We offer a number of paid services (www.codeworxtech.com): |
79233 | - Web Hosting on highly optimized fast and secure servers |
79234 | - Technology Consulting |
79235 | - Oursourcing (highly qualified programmers and graphic designers) |
79236 '---------------------------------------------------------------------------'
79237 */
79238 /**
79239 * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
79240 * commands except TURN which will always return a not implemented
79241 * error. SMTP also provides some utility methods for sending mail
79242 * to an SMTP server.
79243 * @package PHPMailer
79244 * @author Chris Ryan
79245 */
79246
79247 class SMTP
79248 {
79249 /**
79250 * SMTP server port
79251 * @var int
79252 */
79253 var $SMTP_PORT = 25;
79254
79255 /**
79256 * SMTP reply line ending
79257 * @var string
79258 */
79259 var $CRLF = "\r\n";
79260
79261 /**
79262 * Sets whether debugging is turned on
79263 * @var bool
79264 */
79265 var $do_debug; # the level of debug to perform
79266
79267 /**
79268 * Sets VERP use on/off (default is off)
79269 * @var bool
79270 */
79271 var $do_verp = false;
79272
79273 /**#@+
79274 * @access private
79275 */
79276 var $smtp_conn; # the socket to the server
79277 var $error; # error if any on the last call
79278 var $helo_rply; # the reply the server sent to us for HELO
79279 /**#@-*/
79280
79281 /**
79282 * Initialize the class so that the data is in a known state.
79283 * @access public
79284 * @return void
79285 */
79286 function SMTP() {
79287 $this->smtp_conn = 0;
79288 $this->error = null;
79289 $this->helo_rply = null;
79290
79291 $this->do_debug = 0;
79292 }
79293
79294 /*************************************************************
79295 * CONNECTION FUNCTIONS *
79296 ***********************************************************/
79297
79298 /**
79299 * Connect to the server specified on the port specified.
79300 * If the port is not specified use the default SMTP_PORT.
79301 * If tval is specified then a connection will try and be
79302 * established with the server for that number of seconds.
79303 * If tval is not specified the default is 30 seconds to
79304 * try on the connection.
79305 *
79306 * SMTP CODE SUCCESS: 220
79307 * SMTP CODE FAILURE: 421
79308 * @access public
79309 * @return bool
79310 */
79311 function Connect($host,$port=0,$tval=30) {
79312 # set the error val to null so there is no confusion
79313 $this->error = null;
79314
79315 # make sure we are __not__ connected
79316 if($this->connected()) {
79317 # ok we are connected! what should we do?
79318 # for now we will just give an error saying we
79319 # are already connected
79320 $this->error = array("error" => "Already connected to a server");
79321 return false;
79322 }
79323
79324 if(empty($port)) {
79325 $port = $this->SMTP_PORT;
79326 }
79327
79328 #connect to the smtp server
79329 $this->smtp_conn = fsockopen($host, # the host of the server
79330 $port, # the port to use
79331 $errno, # error number if any
79332 $errstr, # error message if any
79333 $tval); # give up after ? secs
79334 # verify we connected properly
79335 if(empty($this->smtp_conn)) {
79336 $this->error = array("error" => "Failed to connect to server",
79337 "errno" => $errno,
79338 "errstr" => $errstr);
79339 if($this->do_debug >= 1) {
79340 echo "SMTP -> ERROR: " . $this->error["error"] .
79341 ": $errstr ($errno)" . $this->CRLF;
79342 }
79343 return false;
79344 }
79345
79346 # sometimes the SMTP server takes a little longer to respond
79347 # so we will give it a longer timeout for the first read
79348 // Windows still does not have support for this timeout function
79349 if(substr(PHP_OS, 0, 3) != "WIN")
79350 socket_set_timeout($this->smtp_conn, $tval, 0);
79351
79352 # get any announcement stuff
79353 $announce = $this->get_lines();
79354
79355 # set the timeout of any socket functions at 1/10 of a second
79356 //if(function_exists("socket_set_timeout"))
79357 // socket_set_timeout($this->smtp_conn, 0, 100000);
79358
79359 if($this->do_debug >= 2) {
79360 echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
79361 }
79362
79363 return true;
79364 }
79365
79366 /**
79367 * Performs SMTP authentication. Must be run after running the
79368 * Hello() method. Returns true if successfully authenticated.
79369 * @access public
79370 * @return bool
79371 */
79372 function Authenticate($username, $password) {
79373 // Start authentication
79374 fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
79375
79376 $rply = $this->get_lines();
79377 $code = substr($rply,0,3);
79378
79379 if($code != 334) {
79380 $this->error =
79381 array("error" => "AUTH not accepted from server",
79382 "smtp_code" => $code,
79383 "smtp_msg" => substr($rply,4));
79384 if($this->do_debug >= 1) {
79385 echo "SMTP -> ERROR: " . $this->error["error"] .
79386 ": " . $rply . $this->CRLF;
79387 }
79388 return false;
79389 }
79390
79391 // Send encoded username
79392 fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
79393
79394 $rply = $this->get_lines();
79395 $code = substr($rply,0,3);
79396
79397 if($code != 334) {
79398 $this->error =
79399 array("error" => "Username not accepted from server",
79400 "smtp_code" => $code,
79401 "smtp_msg" => substr($rply,4));
79402 if($this->do_debug >= 1) {
79403 echo "SMTP -> ERROR: " . $this->error["error"] .
79404 ": " . $rply . $this->CRLF;
79405 }
79406 return false;
79407 }
79408
79409 // Send encoded password
79410 fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
79411
79412 $rply = $this->get_lines();
79413 $code = substr($rply,0,3);
79414
79415 if($code != 235) {
79416 $this->error =
79417 array("error" => "Password not accepted from server",
79418 "smtp_code" => $code,
79419 "smtp_msg" => substr($rply,4));
79420 if($this->do_debug >= 1) {
79421 echo "SMTP -> ERROR: " . $this->error["error"] .
79422 ": " . $rply . $this->CRLF;
79423 }
79424 return false;
79425 }
79426
79427 return true;
79428 }
79429
79430 /**
79431 * Returns true if connected to a server otherwise false
79432 * @access private
79433 * @return bool
79434 */
79435 function Connected() {
79436 if(!empty($this->smtp_conn)) {
79437 $sock_status = socket_get_status($this->smtp_conn);
79438 if($sock_status["eof"]) {
79439 # hmm this is an odd situation... the socket is
79440 # valid but we are not connected anymore
79441 if($this->do_debug >= 1) {
79442 echo "SMTP -> NOTICE:" . $this->CRLF .
79443 "EOF caught while checking if connected";
79444 }
79445 $this->Close();
79446 return false;
79447 }
79448 return true; # everything looks good
79449 }
79450 return false;
79451 }
79452
79453 /**
79454 * Closes the socket and cleans up the state of the class.
79455 * It is not considered good to use this function without
79456 * first trying to use QUIT.
79457 * @access public
79458 * @return void
79459 */
79460 function Close() {
79461 $this->error = null; # so there is no confusion
79462 $this->helo_rply = null;
79463 if(!empty($this->smtp_conn)) {
79464 # close the connection and cleanup
79465 fclose($this->smtp_conn);
79466 $this->smtp_conn = 0;
79467 }
79468 }
79469
79470 /***************************************************************
79471 * SMTP COMMANDS *
79472 *************************************************************/
79473
79474 /**
79475 * Issues a data command and sends the msg_data to the server
79476 * finializing the mail transaction. $msg_data is the message
79477 * that is to be send with the headers. Each header needs to be
79478 * on a single line followed by a <CRLF> with the message headers
79479 * and the message body being seperated by and additional <CRLF>.
79480 *
79481 * Implements rfc 821: DATA <CRLF>
79482 *
79483 * SMTP CODE INTERMEDIATE: 354
79484 * [data]
79485 * <CRLF>.<CRLF>
79486 * SMTP CODE SUCCESS: 250
79487 * SMTP CODE FAILURE: 552,554,451,452
79488 * SMTP CODE FAILURE: 451,554
79489 * SMTP CODE ERROR : 500,501,503,421
79490 * @access public
79491 * @return bool
79492 */
79493 function Data($msg_data) {
79494 $this->error = null; # so no confusion is caused
79495
79496 if(!$this->connected()) {
79497 $this->error = array(
79498 "error" => "Called Data() without being connected");
79499 return false;
79500 }
79501
79502 fputs($this->smtp_conn,"DATA" . $this->CRLF);
79503
79504 $rply = $this->get_lines();
79505 $code = substr($rply,0,3);
79506
79507 if($this->do_debug >= 2) {
79508 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79509 }
79510
79511 if($code != 354) {
79512 $this->error =
79513 array("error" => "DATA command not accepted from server",
79514 "smtp_code" => $code,
79515 "smtp_msg" => substr($rply,4));
79516 if($this->do_debug >= 1) {
79517 echo "SMTP -> ERROR: " . $this->error["error"] .
79518 ": " . $rply . $this->CRLF;
79519 }
79520 return false;
79521 }
79522
79523 # the server is ready to accept data!
79524 # according to rfc 821 we should not send more than 1000
79525 # including the CRLF
79526 # characters on a single line so we will break the data up
79527 # into lines by \r and/or \n then if needed we will break
79528 # each of those into smaller lines to fit within the limit.
79529 # in addition we will be looking for lines that start with
79530 # a period '.' and append and additional period '.' to that
79531 # line. NOTE: this does not count towards are limit.
79532
79533 # normalize the line breaks so we know the explode works
79534 $msg_data = str_replace("\r\n","\n",$msg_data);
79535 $msg_data = str_replace("\r","\n",$msg_data);
79536 $lines = explode("\n",$msg_data);
79537
79538 # we need to find a good way to determine is headers are
79539 # in the msg_data or if it is a straight msg body
79540 # currently I am assuming rfc 822 definitions of msg headers
79541 # and if the first field of the first line (':' sperated)
79542 # does not contain a space then it _should_ be a header
79543 # and we can process all lines before a blank "" line as
79544 # headers.
79545 $field = substr($lines[0],0,strpos($lines[0],":"));
79546 $in_headers = false;
79547 if(!empty($field) && !strstr($field," ")) {
79548 $in_headers = true;
79549 }
79550
79551 $max_line_length = 998; # used below; set here for ease in change
79552
79553 while(list(,$line) = @each($lines)) {
79554 $lines_out = null;
79555 if($line == "" && $in_headers) {
79556 $in_headers = false;
79557 }
79558 # ok we need to break this line up into several
79559 # smaller lines
79560 while(strlen($line) > $max_line_length) {
79561 $pos = strrpos(substr($line,0,$max_line_length)," ");
79562
79563 # Patch to fix DOS attack
79564 if(!$pos) {
79565 $pos = $max_line_length - 1;
79566 }
79567
79568 $lines_out[] = substr($line,0,$pos);
79569 $line = substr($line,$pos + 1);
79570 # if we are processing headers we need to
79571 # add a LWSP-char to the front of the new line
79572 # rfc 822 on long msg headers
79573 if($in_headers) {
79574 $line = "\t" . $line;
79575 }
79576 }
79577 $lines_out[] = $line;
79578
79579 # now send the lines to the server
79580 while(list(,$line_out) = @each($lines_out)) {
79581 if(strlen($line_out) > 0)
79582 {
79583 if(substr($line_out, 0, 1) == ".") {
79584 $line_out = "." . $line_out;
79585 }
79586 }
79587 fputs($this->smtp_conn,$line_out . $this->CRLF);
79588 }
79589 }
79590
79591 # ok all the message data has been sent so lets get this
79592 # over with aleady
79593 fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
79594
79595 $rply = $this->get_lines();
79596 $code = substr($rply,0,3);
79597
79598 if($this->do_debug >= 2) {
79599 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79600 }
79601
79602 if($code != 250) {
79603 $this->error =
79604 array("error" => "DATA not accepted from server",
79605 "smtp_code" => $code,
79606 "smtp_msg" => substr($rply,4));
79607 if($this->do_debug >= 1) {
79608 echo "SMTP -> ERROR: " . $this->error["error"] .
79609 ": " . $rply . $this->CRLF;
79610 }
79611 return false;
79612 }
79613 return true;
79614 }
79615
79616 /**
79617 * Expand takes the name and asks the server to list all the
79618 * people who are members of the _list_. Expand will return
79619 * back and array of the result or false if an error occurs.
79620 * Each value in the array returned has the format of:
79621 * [ <full-name> <sp> ] <path>
79622 * The definition of <path> is defined in rfc 821
79623 *
79624 * Implements rfc 821: EXPN <SP> <string> <CRLF>
79625 *
79626 * SMTP CODE SUCCESS: 250
79627 * SMTP CODE FAILURE: 550
79628 * SMTP CODE ERROR : 500,501,502,504,421
79629 * @access public
79630 * @return string array
79631 */
79632 function Expand($name) {
79633 $this->error = null; # so no confusion is caused
79634
79635 if(!$this->connected()) {
79636 $this->error = array(
79637 "error" => "Called Expand() without being connected");
79638 return false;
79639 }
79640
79641 fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
79642
79643 $rply = $this->get_lines();
79644 $code = substr($rply,0,3);
79645
79646 if($this->do_debug >= 2) {
79647 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79648 }
79649
79650 if($code != 250) {
79651 $this->error =
79652 array("error" => "EXPN not accepted from server",
79653 "smtp_code" => $code,
79654 "smtp_msg" => substr($rply,4));
79655 if($this->do_debug >= 1) {
79656 echo "SMTP -> ERROR: " . $this->error["error"] .
79657 ": " . $rply . $this->CRLF;
79658 }
79659 return false;
79660 }
79661
79662 # parse the reply and place in our array to return to user
79663 $entries = explode($this->CRLF,$rply);
79664 while(list(,$l) = @each($entries)) {
79665 $list[] = substr($l,4);
79666 }
79667
79668 return $list;
79669 }
79670
79671 /**
79672 * Sends the HELO command to the smtp server.
79673 * This makes sure that we and the server are in
79674 * the same known state.
79675 *
79676 * Implements from rfc 821: HELO <SP> <domain> <CRLF>
79677 *
79678 * SMTP CODE SUCCESS: 250
79679 * SMTP CODE ERROR : 500, 501, 504, 421
79680 * @access public
79681 * @return bool
79682 */
79683 function Hello($host="") {
79684 $this->error = null; # so no confusion is caused
79685
79686 if(!$this->connected()) {
79687 $this->error = array(
79688 "error" => "Called Hello() without being connected");
79689 return false;
79690 }
79691
79692 # if a hostname for the HELO was not specified determine
79693 # a suitable one to send
79694 if(empty($host)) {
79695 # we need to determine some sort of appopiate default
79696 # to send to the server
79697 $host = "localhost";
79698 }
79699
79700 // Send extended hello first (RFC 2821)
79701 if(!$this->SendHello("EHLO", $host))
79702 {
79703 if(!$this->SendHello("HELO", $host))
79704 return false;
79705 }
79706
79707 return true;
79708 }
79709
79710 /**
79711 * Sends a HELO/EHLO command.
79712 * @access private
79713 * @return bool
79714 */
79715 function SendHello($hello, $host) {
79716 fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
79717
79718 $rply = $this->get_lines();
79719 $code = substr($rply,0,3);
79720
79721 if($this->do_debug >= 2) {
79722 echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;
79723 }
79724
79725 if($code != 250) {
79726 $this->error =
79727 array("error" => $hello . " not accepted from server",
79728 "smtp_code" => $code,
79729 "smtp_msg" => substr($rply,4));
79730 if($this->do_debug >= 1) {
79731 echo "SMTP -> ERROR: " . $this->error["error"] .
79732 ": " . $rply . $this->CRLF;
79733 }
79734 return false;
79735 }
79736
79737 $this->helo_rply = $rply;
79738
79739 return true;
79740 }
79741
79742 /**
79743 * Gets help information on the keyword specified. If the keyword
79744 * is not specified then returns generic help, ussually contianing
79745 * A list of keywords that help is available on. This function
79746 * returns the results back to the user. It is up to the user to
79747 * handle the returned data. If an error occurs then false is
79748 * returned with $this->error set appropiately.
79749 *
79750 * Implements rfc 821: HELP [ <SP> <string> ] <CRLF>
79751 *
79752 * SMTP CODE SUCCESS: 211,214
79753 * SMTP CODE ERROR : 500,501,502,504,421
79754 * @access public
79755 * @return string
79756 */
79757 function Help($keyword="") {
79758 $this->error = null; # to avoid confusion
79759
79760 if(!$this->connected()) {
79761 $this->error = array(
79762 "error" => "Called Help() without being connected");
79763 return false;
79764 }
79765
79766 $extra = "";
79767 if(!empty($keyword)) {
79768 $extra = " " . $keyword;
79769 }
79770
79771 fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
79772
79773 $rply = $this->get_lines();
79774 $code = substr($rply,0,3);
79775
79776 if($this->do_debug >= 2) {
79777 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79778 }
79779
79780 if($code != 211 && $code != 214) {
79781 $this->error =
79782 array("error" => "HELP not accepted from server",
79783 "smtp_code" => $code,
79784 "smtp_msg" => substr($rply,4));
79785 if($this->do_debug >= 1) {
79786 echo "SMTP -> ERROR: " . $this->error["error"] .
79787 ": " . $rply . $this->CRLF;
79788 }
79789 return false;
79790 }
79791
79792 return $rply;
79793 }
79794
79795 /**
79796 * Starts a mail transaction from the email address specified in
79797 * $from. Returns true if successful or false otherwise. If True
79798 * the mail transaction is started and then one or more Recipient
79799 * commands may be called followed by a Data command.
79800 *
79801 * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
79802 *
79803 * SMTP CODE SUCCESS: 250
79804 * SMTP CODE SUCCESS: 552,451,452
79805 * SMTP CODE SUCCESS: 500,501,421
79806 * @access public
79807 * @return bool
79808 */
79809 function Mail($from) {
79810 $this->error = null; # so no confusion is caused
79811
79812 if(!$this->connected()) {
79813 $this->error = array(
79814 "error" => "Called Mail() without being connected");
79815 return false;
79816 }
79817
79818 $useVerp = ($this->do_verp ? "XVERP" : "");
79819 fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
79820
79821 $rply = $this->get_lines();
79822 $code = substr($rply,0,3);
79823
79824 if($this->do_debug >= 2) {
79825 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79826 }
79827
79828 if($code != 250) {
79829 $this->error =
79830 array("error" => "MAIL not accepted from server",
79831 "smtp_code" => $code,
79832 "smtp_msg" => substr($rply,4));
79833 if($this->do_debug >= 1) {
79834 echo "SMTP -> ERROR: " . $this->error["error"] .
79835 ": " . $rply . $this->CRLF;
79836 }
79837 return false;
79838 }
79839 return true;
79840 }
79841
79842 /**
79843 * Sends the command NOOP to the SMTP server.
79844 *
79845 * Implements from rfc 821: NOOP <CRLF>
79846 *
79847 * SMTP CODE SUCCESS: 250
79848 * SMTP CODE ERROR : 500, 421
79849 * @access public
79850 * @return bool
79851 */
79852 function Noop() {
79853 $this->error = null; # so no confusion is caused
79854
79855 if(!$this->connected()) {
79856 $this->error = array(
79857 "error" => "Called Noop() without being connected");
79858 return false;
79859 }
79860
79861 fputs($this->smtp_conn,"NOOP" . $this->CRLF);
79862
79863 $rply = $this->get_lines();
79864 $code = substr($rply,0,3);
79865
79866 if($this->do_debug >= 2) {
79867 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79868 }
79869
79870 if($code != 250) {
79871 $this->error =
79872 array("error" => "NOOP not accepted from server",
79873 "smtp_code" => $code,
79874 "smtp_msg" => substr($rply,4));
79875 if($this->do_debug >= 1) {
79876 echo "SMTP -> ERROR: " . $this->error["error"] .
79877 ": " . $rply . $this->CRLF;
79878 }
79879 return false;
79880 }
79881 return true;
79882 }
79883
79884 /**
79885 * Sends the quit command to the server and then closes the socket
79886 * if there is no error or the $close_on_error argument is true.
79887 *
79888 * Implements from rfc 821: QUIT <CRLF>
79889 *
79890 * SMTP CODE SUCCESS: 221
79891 * SMTP CODE ERROR : 500
79892 * @access public
79893 * @return bool
79894 */
79895 function Quit($close_on_error=true) {
79896 $this->error = null; # so there is no confusion
79897
79898 if(!$this->connected()) {
79899 $this->error = array(
79900 "error" => "Called Quit() without being connected");
79901 return false;
79902 }
79903
79904 # send the quit command to the server
79905 fputs($this->smtp_conn,"quit" . $this->CRLF);
79906
79907 # get any good-bye messages
79908 $byemsg = $this->get_lines();
79909
79910 if($this->do_debug >= 2) {
79911 echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
79912 }
79913
79914 $rval = true;
79915 $e = null;
79916
79917 $code = substr($byemsg,0,3);
79918 if($code != 221) {
79919 # use e as a tmp var cause Close will overwrite $this->error
79920 $e = array("error" => "SMTP server rejected quit command",
79921 "smtp_code" => $code,
79922 "smtp_rply" => substr($byemsg,4));
79923 $rval = false;
79924 if($this->do_debug >= 1) {
79925 echo "SMTP -> ERROR: " . $e["error"] . ": " .
79926 $byemsg . $this->CRLF;
79927 }
79928 }
79929
79930 if(empty($e) || $close_on_error) {
79931 $this->Close();
79932 }
79933
79934 return $rval;
79935 }
79936
79937 /**
79938 * Sends the command RCPT to the SMTP server with the TO: argument of $to.
79939 * Returns true if the recipient was accepted false if it was rejected.
79940 *
79941 * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
79942 *
79943 * SMTP CODE SUCCESS: 250,251
79944 * SMTP CODE FAILURE: 550,551,552,553,450,451,452
79945 * SMTP CODE ERROR : 500,501,503,421
79946 * @access public
79947 * @return bool
79948 */
79949 function Recipient($to) {
79950 $this->error = null; # so no confusion is caused
79951
79952 if(!$this->connected()) {
79953 $this->error = array(
79954 "error" => "Called Recipient() without being connected");
79955 return false;
79956 }
79957
79958 fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
79959
79960 $rply = $this->get_lines();
79961 $code = substr($rply,0,3);
79962
79963 if($this->do_debug >= 2) {
79964 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
79965 }
79966
79967 if($code != 250 && $code != 251) {
79968 $this->error =
79969 array("error" => "RCPT not accepted from server",
79970 "smtp_code" => $code,
79971 "smtp_msg" => substr($rply,4));
79972 if($this->do_debug >= 1) {
79973 echo "SMTP -> ERROR: " . $this->error["error"] .
79974 ": " . $rply . $this->CRLF;
79975 }
79976 return false;
79977 }
79978 return true;
79979 }
79980
79981 /**
79982 * Sends the RSET command to abort and transaction that is
79983 * currently in progress. Returns true if successful false
79984 * otherwise.
79985 *
79986 * Implements rfc 821: RSET <CRLF>
79987 *
79988 * SMTP CODE SUCCESS: 250
79989 * SMTP CODE ERROR : 500,501,504,421
79990 * @access public
79991 * @return bool
79992 */
79993 function Reset() {
79994 $this->error = null; # so no confusion is caused
79995
79996 if(!$this->connected()) {
79997 $this->error = array(
79998 "error" => "Called Reset() without being connected");
79999 return false;
80000 }
80001
80002 fputs($this->smtp_conn,"RSET" . $this->CRLF);
80003
80004 $rply = $this->get_lines();
80005 $code = substr($rply,0,3);
80006
80007 if($this->do_debug >= 2) {
80008 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
80009 }
80010
80011 if($code != 250) {
80012 $this->error =
80013 array("error" => "RSET failed",
80014 "smtp_code" => $code,
80015 "smtp_msg" => substr($rply,4));
80016 if($this->do_debug >= 1) {
80017 echo "SMTP -> ERROR: " . $this->error["error"] .
80018 ": " . $rply . $this->CRLF;
80019 }
80020 return false;
80021 }
80022
80023 return true;
80024 }
80025
80026 /**
80027 * Starts a mail transaction from the email address specified in
80028 * $from. Returns true if successful or false otherwise. If True
80029 * the mail transaction is started and then one or more Recipient
80030 * commands may be called followed by a Data command. This command
80031 * will send the message to the users terminal if they are logged
80032 * in.
80033 *
80034 * Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>
80035 *
80036 * SMTP CODE SUCCESS: 250
80037 * SMTP CODE SUCCESS: 552,451,452
80038 * SMTP CODE SUCCESS: 500,501,502,421
80039 * @access public
80040 * @return bool
80041 */
80042 function Send($from) {
80043 $this->error = null; # so no confusion is caused
80044
80045 if(!$this->connected()) {
80046 $this->error = array(
80047 "error" => "Called Send() without being connected");
80048 return false;
80049 }
80050
80051 fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
80052
80053 $rply = $this->get_lines();
80054 $code = substr($rply,0,3);
80055
80056 if($this->do_debug >= 2) {
80057 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
80058 }
80059
80060 if($code != 250) {
80061 $this->error =
80062 array("error" => "SEND not accepted from server",
80063 "smtp_code" => $code,
80064 "smtp_msg" => substr($rply,4));
80065 if($this->do_debug >= 1) {
80066 echo "SMTP -> ERROR: " . $this->error["error"] .
80067 ": " . $rply . $this->CRLF;
80068 }
80069 return false;
80070 }
80071 return true;
80072 }
80073
80074 /**
80075 * Starts a mail transaction from the email address specified in
80076 * $from. Returns true if successful or false otherwise. If True
80077 * the mail transaction is started and then one or more Recipient
80078 * commands may be called followed by a Data command. This command
80079 * will send the message to the users terminal if they are logged
80080 * in and send them an email.
80081 *
80082 * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
80083 *
80084 * SMTP CODE SUCCESS: 250
80085 * SMTP CODE SUCCESS: 552,451,452
80086 * SMTP CODE SUCCESS: 500,501,502,421
80087 * @access public
80088 * @return bool
80089 */
80090 function SendAndMail($from) {
80091 $this->error = null; # so no confusion is caused
80092
80093 if(!$this->connected()) {
80094 $this->error = array(
80095 "error" => "Called SendAndMail() without being connected");
80096 return false;
80097 }
80098
80099 fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
80100
80101 $rply = $this->get_lines();
80102 $code = substr($rply,0,3);
80103
80104 if($this->do_debug >= 2) {
80105 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
80106 }
80107
80108 if($code != 250) {
80109 $this->error =
80110 array("error" => "SAML not accepted from server",
80111 "smtp_code" => $code,
80112 "smtp_msg" => substr($rply,4));
80113 if($this->do_debug >= 1) {
80114 echo "SMTP -> ERROR: " . $this->error["error"] .
80115 ": " . $rply . $this->CRLF;
80116 }
80117 return false;
80118 }
80119 return true;
80120 }
80121
80122 /**
80123 * Starts a mail transaction from the email address specified in
80124 * $from. Returns true if successful or false otherwise. If True
80125 * the mail transaction is started and then one or more Recipient
80126 * commands may be called followed by a Data command. This command
80127 * will send the message to the users terminal if they are logged
80128 * in or mail it to them if they are not.
80129 *
80130 * Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>
80131 *
80132 * SMTP CODE SUCCESS: 250
80133 * SMTP CODE SUCCESS: 552,451,452
80134 * SMTP CODE SUCCESS: 500,501,502,421
80135 * @access public
80136 * @return bool
80137 */
80138 function SendOrMail($from) {
80139 $this->error = null; # so no confusion is caused
80140
80141 if(!$this->connected()) {
80142 $this->error = array(
80143 "error" => "Called SendOrMail() without being connected");
80144 return false;
80145 }
80146
80147 fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
80148
80149 $rply = $this->get_lines();
80150 $code = substr($rply,0,3);
80151
80152 if($this->do_debug >= 2) {
80153 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
80154 }
80155
80156 if($code != 250) {
80157 $this->error =
80158 array("error" => "SOML not accepted from server",
80159 "smtp_code" => $code,
80160 "smtp_msg" => substr($rply,4));
80161 if($this->do_debug >= 1) {
80162 echo "SMTP -> ERROR: " . $this->error["error"] .
80163 ": " . $rply . $this->CRLF;
80164 }
80165 return false;
80166 }
80167 return true;
80168 }
80169
80170 /**
80171 * This is an optional command for SMTP that this class does not
80172 * support. This method is here to make the RFC821 Definition
80173 * complete for this class and __may__ be implimented in the future
80174 *
80175 * Implements from rfc 821: TURN <CRLF>
80176 *
80177 * SMTP CODE SUCCESS: 250
80178 * SMTP CODE FAILURE: 502
80179 * SMTP CODE ERROR : 500, 503
80180 * @access public
80181 * @return bool
80182 */
80183 function Turn() {
80184 $this->error = array("error" => "This method, TURN, of the SMTP ".
80185 "is not implemented");
80186 if($this->do_debug >= 1) {
80187 echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
80188 }
80189 return false;
80190 }
80191
80192 /**
80193 * Verifies that the name is recognized by the server.
80194 * Returns false if the name could not be verified otherwise
80195 * the response from the server is returned.
80196 *
80197 * Implements rfc 821: VRFY <SP> <string> <CRLF>
80198 *
80199 * SMTP CODE SUCCESS: 250,251
80200 * SMTP CODE FAILURE: 550,551,553
80201 * SMTP CODE ERROR : 500,501,502,421
80202 * @access public
80203 * @return int
80204 */
80205 function Verify($name) {
80206 $this->error = null; # so no confusion is caused
80207
80208 if(!$this->connected()) {
80209 $this->error = array(
80210 "error" => "Called Verify() without being connected");
80211 return false;
80212 }
80213
80214 fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
80215
80216 $rply = $this->get_lines();
80217 $code = substr($rply,0,3);
80218
80219 if($this->do_debug >= 2) {
80220 echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
80221 }
80222
80223 if($code != 250 && $code != 251) {
80224 $this->error =
80225 array("error" => "VRFY failed on name '$name'",
80226 "smtp_code" => $code,
80227 "smtp_msg" => substr($rply,4));
80228 if($this->do_debug >= 1) {
80229 echo "SMTP -> ERROR: " . $this->error["error"] .
80230 ": " . $rply . $this->CRLF;
80231 }
80232 return false;
80233 }
80234 return $rply;
80235 }
80236
80237 /*******************************************************************
80238 * INTERNAL FUNCTIONS *
80239 ******************************************************************/
80240
80241 /**
80242 * Read in as many lines as possible
80243 * either before eof or socket timeout occurs on the operation.
80244 * With SMTP we can tell if we have more lines to read if the
80245 * 4th character is '-' symbol. If it is a space then we don't
80246 * need to read anything else.
80247 * @access private
80248 * @return string
80249 */
80250 function get_lines() {
80251 $data = "";
80252 while($str = @fgets($this->smtp_conn,515)) {
80253 if($this->do_debug >= 4) {
80254 echo "SMTP -> get_lines(): \$data was \"$data\"" .
80255 $this->CRLF;
80256 echo "SMTP -> get_lines(): \$str is \"$str\"" .
80257 $this->CRLF;
80258 }
80259 $data .= $str;
80260 if($this->do_debug >= 4) {
80261 echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
80262 }
80263 # if the 4th character is a space then we are done reading
80264 # so just break the loop
80265 if(substr($str,3,1) == " ") { break; }
80266 }
80267 return $data;
80268 }
80269
80270 }
80271
80272
80273 ?>