Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: PHPMailer/PHPMailer
...
head fork: templar92/PHPMailer
Checking mergeability… Don't worry, you can still create the pull request.
  • 5 commits
  • 49 files changed
  • 0 commit comments
  • 1 contributor
Showing with 4,590 additions and 4,332 deletions.
  1. +1,545 −2,409 class.phpmailer.php
  2. +132 −391 class.pop3.php
  3. +220 −783 class.smtp.php
  4. +21 −21 examples/test_db_smtp_basic.php
  5. +13 −13 examples/test_mail_advanced.php
  6. +13 −13 examples/test_mail_basic.php
  7. +18 −18 examples/test_pop_before_smtp_advanced.php
  8. +17 −17 examples/test_pop_before_smtp_basic.php
  9. +14 −14 examples/test_sendmail_advanced.php
  10. +14 −14 examples/test_sendmail_basic.php
  11. +20 −20 examples/test_smtp_advanced.php
  12. +16 −16 examples/test_smtp_advanced_no_auth.php
  13. +19 −19 examples/test_smtp_basic.php
  14. +15 −15 examples/test_smtp_basic_no_auth.php
  15. +21 −21 examples/test_smtp_gmail_advanced.php
  16. +20 −20 examples/test_smtp_gmail_basic.php
  17. +62 −62 extras/htmlfilter.php
  18. +7 −7 language/phpmailer.lang-ar.php
  19. +7 −7 language/phpmailer.lang-br.php
  20. +6 −6 language/phpmailer.lang-ca.php
  21. +1 −1  language/phpmailer.lang-ch.php
  22. +6 −6 language/phpmailer.lang-cz.php
  23. +9 −9 language/phpmailer.lang-de.php
  24. +7 −7 language/phpmailer.lang-dk.php
  25. +7 −7 language/phpmailer.lang-es.php
  26. +7 −7 language/phpmailer.lang-et.php
  27. +8 −8 language/phpmailer.lang-fi.php
  28. +7 −7 language/phpmailer.lang-fo.php
  29. +7 −7 language/phpmailer.lang-fr.php
  30. +7 −7 language/phpmailer.lang-hu.php
  31. +4 −4 language/phpmailer.lang-it.php
  32. +1 −1  language/phpmailer.lang-ja.php
  33. +7 −7 language/phpmailer.lang-nl.php
  34. +7 −7 language/phpmailer.lang-no.php
  35. +7 −7 language/phpmailer.lang-pl.php
  36. +7 −7 language/phpmailer.lang-ro.php
  37. +7 −7 language/phpmailer.lang-ru.php
  38. +7 −7 language/phpmailer.lang-se.php
  39. +7 −7 language/phpmailer.lang-tr.php
  40. +1 −1  language/phpmailer.lang-zh.php
  41. +1 −1  language/phpmailer.lang-zh_cn.php
  42. +67 −0 mail_mailer.php
  43. +1,665 −0 mailer.php
  44. +67 −0 sendmail_mailer.php
  45. +145 −0 smtp_mailer.php
  46. +200 −200 test/phpmailerTest.php
  47. +16 −16 test/test_callback.php
  48. +20 −20 test/testemail.php
  49. +88 −88 test_script/index.php
View
3,954 class.phpmailer.php
1,545 additions, 2,409 deletions not shown
View
523 class.pop3.php
@@ -1,410 +1,151 @@
<?php
-/*~ class.pop3.php
-.---------------------------------------------------------------------------.
-| Software: PHPMailer - PHP email class |
-| Version: 5.2.1 |
-| Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ |
-| ------------------------------------------------------------------------- |
-| Admin: Jim Jagielski (project admininistrator) |
-| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
-| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net |
-| : Jim Jagielski (jimjag) jimjag@gmail.com |
-| Founder: Brent R. Matzelle (original founder) |
-| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. |
-| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. |
-| Copyright (c) 2001-2003, Brent R. Matzelle |
-| ------------------------------------------------------------------------- |
-| License: Distributed under the Lesser General Public License (LGPL) |
-| http://www.gnu.org/copyleft/lesser.html |
-| This program is distributed in the hope that it will be useful - WITHOUT |
-| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
-| FITNESS FOR A PARTICULAR PURPOSE. |
-'---------------------------------------------------------------------------'
-*/
-
-/**
- * PHPMailer - PHP POP Before SMTP Authentication Class
- * NOTE: Designed for use with PHP version 5 and up
- * @package PHPMailer
- * @author Andy Prevost
- * @author Marcus Bointon
- * @author Jim Jagielski
- * @copyright 2010 - 2012 Jim Jagielski
- * @copyright 2004 - 2009 Andy Prevost
- * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
- * @version $Id: class.pop3.php 450 2010-06-23 16:46:33Z coolbru $
- */
-
-/**
- * POP Before SMTP Authentication Class
- * Version 5.2.1
- *
- * Author: Richard Davey (rich@corephp.co.uk)
- * Modifications: Andy Prevost
- * License: LGPL, see PHPMailer License
- *
- * Specifically for PHPMailer to allow POP before SMTP authentication.
- * Does not yet work with APOP - if you have an APOP account, contact Richard Davey
- * and we can test changes to this script.
- *
- * This class is based on the structure of the SMTP class originally authored by Chris Ryan
- *
- * This class is rfc 1939 compliant and implements all the commands
- * required for POP3 connection, authentication and disconnection.
- *
- * @package PHPMailer
- * @author Richard Davey
- */
-
-class POP3 {
- /**
- * Default POP3 port
- * @var int
- */
- public $POP3_PORT = 110;
-
- /**
- * Default Timeout
- * @var int
- */
- public $POP3_TIMEOUT = 30;
-
- /**
- * POP3 Carriage Return + Line Feed
- * @var string
- */
- public $CRLF = "\r\n";
-
- /**
- * Displaying Debug warnings? (0 = now, 1+ = yes)
- * @var int
- */
- public $do_debug = 2;
-
- /**
- * POP3 Mail Server
- * @var string
- */
- public $host;
-
- /**
- * POP3 Port
- * @var int
- */
- public $port;
-
- /**
- * POP3 Timeout Value
- * @var int
- */
- public $tval;
-
- /**
- * POP3 Username
- * @var string
- */
- public $username;
-
- /**
- * POP3 Password
- * @var string
- */
- public $password;
-
- /**
- * Sets the POP3 PHPMailer Version number
- * @var string
- */
- public $Version = '5.2.1';
-
- /////////////////////////////////////////////////
- // PROPERTIES, PRIVATE AND PROTECTED
- /////////////////////////////////////////////////
-
- private $pop_conn;
- private $connected;
- private $error; // Error log array
-
- /**
- * Constructor, sets the initial values
- * @access public
- * @return POP3
- */
- public function __construct() {
- $this->pop_conn = 0;
- $this->connected = false;
- $this->error = null;
- }
-
- /**
- * Combination of public events - connect, login, disconnect
- * @access public
- * @param string $host
- * @param integer $port
- * @param integer $tval
- * @param string $username
- * @param string $password
- */
- public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) {
- $this->host = $host;
-
- // If no port value is passed, retrieve it
- if ($port == false) {
- $this->port = $this->POP3_PORT;
- } else {
- $this->port = $port;
+class Pop3 {
+
+ const DEFAULT_PORT = 110;
+ const DEFAULT_TIMEOUT = 30;
+
+ public $do_debug = 2;
+
+ public $username;
+ public $password;
+ public $host;
+ public $port;
+ public $tval;
+
+ public $version = '1.0.0';
+
+ private $pop_conn;
+ private $connected;
+ private $error; // Error log array
+
+ public function __construct($host, $username, $password, $port=self::DEFAULT_PORT, $tval=self::DEFAULT_TIMEOUT, $debug_level=0) {
+ $this->pop_conn = 0;
+ $this->connected = FALSE;
+ $this->error = NULL;
+ $this->do_debug = $debug_level;
+ $this->username = $username;
+ $this->password = $password;
+ $this->host = $host;
+ $this->port = $port;
+ $this->tval = $tval;
}
- // If no port value is passed, retrieve it
- if ($tval == false) {
- $this->tval = $this->POP3_TIMEOUT;
- } else {
- $this->tval = $tval;
+ public function authorize() {
+ $result = FALSE;
+ if ($this->connect()) {
+ $result = $this->login();
+ }
+ $this->disconnect();
+ return $result;
}
- $this->do_debug = $debug_level;
- $this->username = $username;
- $this->password = $password;
-
- // Refresh the error log
- $this->error = null;
-
- // Connect
- $result = $this->Connect($this->host, $this->port, $this->tval);
-
- if ($result) {
- $login_result = $this->Login($this->username, $this->password);
-
- if ($login_result) {
- $this->Disconnect();
-
- return true;
- }
-
+ public function connect() {
+ // Are we already connected?
+ if (!$this->connected) {
+ /*
+ On Windows this will raise a PHP Warning error if the hostname doesn't exist.
+ Rather than supress it with @fsockopen, let's capture it cleanly instead
+ */
+ set_error_handler(array(&$this, 'catchWarning'));
+ // Connect to the POP3 server
+ $this->pop_conn = fsockopen($this->host, $this->port, $errno, $errstr, $this->tval);
+ // Restore the error handler
+ restore_error_handler();
+ // Does the Error Log now contain anything?
+ if ($this->error && $this->do_debug >= 1) {
+ $this->displayErrors();
+ }
+ // Did we connect?
+ if ($this->pop_conn == FALSE) {
+ // It would appear not...
+ $this->error = array(
+ 'error' => "Failed to connect to server $host on port $port",
+ 'errno' => $errno,
+ 'errstr' => $errstr
+ );
+ if ($this->do_debug >= 1) {
+ $this->displayErrors();
+ }
+ return FALSE;
+ }
+ // Increase the stream time-out
+ // Check for PHP 4.3.0 or later
+ if (version_compare(phpversion(), '5.0.0', 'ge')) {
+ stream_set_timeout($this->pop_conn, $this->tval, 0);
+ } else {
+ // Does not work on Windows
+ if (substr(PHP_OS, 0, 3) !== 'WIN') {
+ socket_set_timeout($this->pop_conn, $this->tval, 0);
+ }
+ }
+ // Get the POP3 server response
+ $pop3_response = $this->getResponse();
+ // Check for the +OK
+ if ($this->checkResponse($pop3_response)) {
+ // The connection is established and the POP3 server is talking
+ $this->connected = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ return TRUE;
}
- // We need to disconnect regardless if the login succeeded
- $this->Disconnect();
-
- return false;
- }
-
- /**
- * Connect to the POP3 server
- * @access public
- * @param string $host
- * @param integer $port
- * @param integer $tval
- * @return boolean
- */
- public function Connect ($host, $port = false, $tval = 30) {
- // Are we already connected?
- if ($this->connected) {
- return true;
+ public function login() {
+ if ($this->connected || (!$this->connected && $this->connect())) {
+ $pop_username = "USER $this->username" . Mailer::CRLF;
+ $pop_password = "PASS $this->password" . Mailer::CRLF;
+ // Send the Username
+ $this->sendString($pop_username);
+ $pop3_response = $this->getResponse();
+ if ($this->checkResponse($pop3_response)) {
+ // Send the Password
+ $this->sendString($pop_password);
+ return $this->checkResponse($this->getResponse());
+ }
+ }
+ return FALSE;
}
- /*
- On Windows this will raise a PHP Warning error if the hostname doesn't exist.
- Rather than supress it with @fsockopen, let's capture it cleanly instead
- */
-
- set_error_handler(array(&$this, 'catchWarning'));
-
- // Connect to the POP3 server
- $this->pop_conn = fsockopen($host, // POP3 Host
- $port, // Port #
- $errno, // Error Number
- $errstr, // Error Message
- $tval); // Timeout (seconds)
-
- // Restore the error handler
- restore_error_handler();
-
- // Does the Error Log now contain anything?
- if ($this->error && $this->do_debug >= 1) {
- $this->displayErrors();
+ public function disconnect() {
+ $this->sendString('QUIT');
+ fclose($this->pop_conn);
}
- // Did we connect?
- if ($this->pop_conn == false) {
- // It would appear not...
- $this->error = array(
- 'error' => "Failed to connect to server $host on port $port",
- 'errno' => $errno,
- 'errstr' => $errstr
- );
-
- if ($this->do_debug >= 1) {
- $this->displayErrors();
- }
-
- return false;
+ private function getResponse ($size=128) { return fgets($this->pop_conn, $size); }
+
+ private function sendString ($string) { return fwrite($this->pop_conn, $string, strlen($string)); }
+
+ private function checkResponse ($string) {
+ if (substr($string, 0, 3) !== '+OK') {
+ $this->error = array(
+ 'error' => "Server reported an error: $string",
+ 'errno' => 0,
+ 'errstr' => ''
+ );
+ if ($this->do_debug >= 1) {
+ $this->displayErrors();
+ }
+ return FALSE;
+ }
+ return TRUE;
}
- // Increase the stream time-out
-
- // Check for PHP 4.3.0 or later
- if (version_compare(phpversion(), '5.0.0', 'ge')) {
- stream_set_timeout($this->pop_conn, $tval, 0);
- } else {
- // Does not work on Windows
- if (substr(PHP_OS, 0, 3) !== 'WIN') {
- socket_set_timeout($this->pop_conn, $tval, 0);
- }
+ private function displayErrors () {
+ echo '<pre>';
+ foreach ($this->error as $single_error) {
+ print_r($single_error);
+ }
+ echo '</pre>';
}
- // Get the POP3 server response
- $pop3_response = $this->getResponse();
-
- // Check for the +OK
- if ($this->checkResponse($pop3_response)) {
- // The connection is established and the POP3 server is talking
- $this->connected = true;
- return true;
- }
-
- }
-
- /**
- * Login to the POP3 server (does not support APOP yet)
- * @access public
- * @param string $username
- * @param string $password
- * @return boolean
- */
- public function Login ($username = '', $password = '') {
- if ($this->connected == false) {
- $this->error = 'Not connected to POP3 server';
-
- if ($this->do_debug >= 1) {
- $this->displayErrors();
- }
- }
-
- if (empty($username)) {
- $username = $this->username;
- }
-
- if (empty($password)) {
- $password = $this->password;
- }
-
- $pop_username = "USER $username" . $this->CRLF;
- $pop_password = "PASS $password" . $this->CRLF;
-
- // Send the Username
- $this->sendString($pop_username);
- $pop3_response = $this->getResponse();
-
- if ($this->checkResponse($pop3_response)) {
- // Send the Password
- $this->sendString($pop_password);
- $pop3_response = $this->getResponse();
-
- if ($this->checkResponse($pop3_response)) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
+ private function catchWarning ($errno, $errstr, $errfile, $errline) {
+ $this->error[] = array(
+ 'error' => "Connecting to the POP3 server raised a PHP warning: ",
+ 'errno' => $errno,
+ 'errstr' => $errstr
+ );
}
- }
-
- /**
- * Disconnect from the POP3 server
- * @access public
- */
- public function Disconnect () {
- $this->sendString('QUIT');
-
- fclose($this->pop_conn);
- }
-
- /////////////////////////////////////////////////
- // Private Methods
- /////////////////////////////////////////////////
-
- /**
- * Get the socket response back.
- * $size is the maximum number of bytes to retrieve
- * @access private
- * @param integer $size
- * @return string
- */
- private function getResponse ($size = 128) {
- $pop3_response = fgets($this->pop_conn, $size);
-
- return $pop3_response;
- }
-
- /**
- * Send a string down the open socket connection to the POP3 server
- * @access private
- * @param string $string
- * @return integer
- */
- private function sendString ($string) {
- $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
-
- return $bytes_sent;
- }
-
- /**
- * Checks the POP3 server response for +OK or -ERR
- * @access private
- * @param string $string
- * @return boolean
- */
- private function checkResponse ($string) {
- if (substr($string, 0, 3) !== '+OK') {
- $this->error = array(
- 'error' => "Server reported an error: $string",
- 'errno' => 0,
- 'errstr' => ''
- );
-
- if ($this->do_debug >= 1) {
- $this->displayErrors();
- }
-
- return false;
- } else {
- return true;
- }
-
- }
-
- /**
- * If debug is enabled, display the error message array
- * @access private
- */
- private function displayErrors () {
- echo '<pre>';
-
- foreach ($this->error as $single_error) {
- print_r($single_error);
- }
-
- echo '</pre>';
- }
-
- /**
- * Takes over from PHP for the socket warning handler
- * @access private
- * @param integer $errno
- * @param string $errstr
- * @param string $errfile
- * @param integer $errline
- */
- private function catchWarning ($errno, $errstr, $errfile, $errline) {
- $this->error[] = array(
- 'error' => "Connecting to the POP3 server raised a PHP warning: ",
- 'errno' => $errno,
- 'errstr' => $errstr
- );
- }
- // End of class
}
?>
View
1,003 class.smtp.php
@@ -1,817 +1,254 @@
<?php
-/*~ class.smtp.php
-.---------------------------------------------------------------------------.
-| Software: PHPMailer - PHP email class |
-| Version: 5.2.1 |
-| Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ |
-| ------------------------------------------------------------------------- |
-| Admin: Jim Jagielski (project admininistrator) |
-| Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
-| : Marcus Bointon (coolbru) coolbru@users.sourceforge.net |
-| : Jim Jagielski (jimjag) jimjag@gmail.com |
-| Founder: Brent R. Matzelle (original founder) |
-| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. |
-| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. |
-| Copyright (c) 2001-2003, Brent R. Matzelle |
-| ------------------------------------------------------------------------- |
-| License: Distributed under the Lesser General Public License (LGPL) |
-| http://www.gnu.org/copyleft/lesser.html |
-| This program is distributed in the hope that it will be useful - WITHOUT |
-| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
-| FITNESS FOR A PARTICULAR PURPOSE. |
-'---------------------------------------------------------------------------'
-*/
-
-/**
- * PHPMailer - PHP SMTP email transport class
- * NOTE: Designed for use with PHP version 5 and up
- * @package PHPMailer
- * @author Andy Prevost
- * @author Marcus Bointon
- * @copyright 2004 - 2008 Andy Prevost
- * @author Jim Jagielski
- * @copyright 2010 - 2012 Jim Jagielski
- * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)
- * @version $Id: class.smtp.php 450 2010-06-23 16:46:33Z coolbru $
- */
-
-/**
- * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
- * commands except TURN which will always return a not implemented
- * error. SMTP also provides some utility methods for sending mail
- * to an SMTP server.
- * original author: Chris Ryan
- */
-
-class SMTP {
- /**
- * SMTP server port
- * @var int
- */
- public $SMTP_PORT = 25;
-
- /**
- * SMTP reply line ending
- * @var string
- */
- public $CRLF = "\r\n";
-
- /**
- * Sets whether debugging is turned on
- * @var bool
- */
- public $do_debug; // the level of debug to perform
-
- /**
- * Sets VERP use on/off (default is off)
- * @var bool
- */
- public $do_verp = false;
-
- /**
- * Sets the SMTP PHPMailer Version number
- * @var string
- */
- public $Version = '5.2.1';
-
- /////////////////////////////////////////////////
- // PROPERTIES, PRIVATE AND PROTECTED
- /////////////////////////////////////////////////
-
- private $smtp_conn; // the socket to the server
- private $error; // error if any on the last call
- private $helo_rply; // the reply the server sent to us for HELO
-
- /**
- * Initialize the class so that the data is in a known state.
- * @access public
- * @return void
- */
- public function __construct() {
- $this->smtp_conn = 0;
- $this->error = null;
- $this->helo_rply = null;
-
- $this->do_debug = 0;
- }
-
- /////////////////////////////////////////////////
- // CONNECTION FUNCTIONS
- /////////////////////////////////////////////////
-
- /**
- * Connect to the server specified on the port specified.
- * If the port is not specified use the default SMTP_PORT.
- * If tval is specified then a connection will try and be
- * established with the server for that number of seconds.
- * If tval is not specified the default is 30 seconds to
- * try on the connection.
- *
- * SMTP CODE SUCCESS: 220
- * SMTP CODE FAILURE: 421
- * @access public
- * @return bool
- */
- public function Connect($host, $port = 0, $tval = 30) {
- // set the error val to null so there is no confusion
- $this->error = null;
-
- // make sure we are __not__ connected
- if($this->connected()) {
- // already connected, generate error
- $this->error = array("error" => "Already connected to a server");
- return false;
- }
-
- if(empty($port)) {
- $port = $this->SMTP_PORT;
- }
-
- // connect to the smtp server
- $this->smtp_conn = @fsockopen($host, // the host of the server
- $port, // the port to use
- $errno, // error number if any
- $errstr, // error message if any
- $tval); // give up after ? secs
- // verify we connected properly
- if(empty($this->smtp_conn)) {
- $this->error = array("error" => "Failed to connect to server",
- "errno" => $errno,
- "errstr" => $errstr);
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />';
- }
- return false;
- }
-
- // SMTP server can take longer to respond, give longer timeout for first read
- // Windows does not have support for this timeout function
- if(substr(PHP_OS, 0, 3) != "WIN")
- socket_set_timeout($this->smtp_conn, $tval, 0);
-
- // get any announcement
- $announce = $this->get_lines();
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />';
- }
-
- return true;
- }
-
- /**
- * Initiate a TLS communication with the server.
- *
- * SMTP CODE 220 Ready to start TLS
- * SMTP CODE 501 Syntax error (no parameters allowed)
- * SMTP CODE 454 TLS not available due to temporary reason
- * @access public
- * @return bool success
- */
- public function StartTLS() {
- $this->error = null; # to avoid confusion
-
- if(!$this->connected()) {
- $this->error = array("error" => "Called StartTLS() without being connected");
- return false;
- }
-
- fputs($this->smtp_conn,"STARTTLS" . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
- }
-
- if($code != 220) {
- $this->error =
- array("error" => "STARTTLS not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- // Begin encrypted connection
- if(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
- return false;
- }
-
- return true;
- }
-
- /**
- * Performs SMTP authentication. Must be run after running the
- * Hello() method. Returns true if successfully authenticated.
- * @access public
- * @return bool
- */
- public function Authenticate($username, $password) {
- // Start authentication
- fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($code != 334) {
- $this->error =
- array("error" => "AUTH not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- // Send encoded username
- fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($code != 334) {
- $this->error =
- array("error" => "Username not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- // Send encoded password
- fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($code != 235) {
- $this->error =
- array("error" => "Password not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- return true;
- }
-
- /**
- * Returns true if connected to a server otherwise false
- * @access public
- * @return bool
- */
- public function Connected() {
- if(!empty($this->smtp_conn)) {
- $sock_status = socket_get_status($this->smtp_conn);
- if($sock_status["eof"]) {
- // the socket is valid but we are not connected
- if($this->do_debug >= 1) {
- echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected";
+class Smtp {
+
+ const DEFAULT_PORT = 25;
+ const COMMAND_OK = 250;
+
+ public $do_debug; // the level of debug to perform
+ public $do_verp = FALSE;
+ public $version = '1.0.0';
+
+ private $smtp_conn; // the socket to the server
+ private $errors; // error if any on the last call
+ private $helo_rply; // the reply the server sent to us for HELO
+ private $cmd_reply;
+
+ public function __construct($debug=0) {
+ $this->smtp_conn = 0;
+ $this->errors = array();
+ $this->helo_rply = NULL;
+ $this->do_debug = $debug;
+ }
+
+ public function connect($host, $port=self::DEFAULT_PORT, $tval=30) {
+ // set the error val to NULL so there is no confusion
+ $this->errors = NULL;
+ // make sure we are __not__ connected
+ if ($this->connected()) {
+ // already connected, generate error
+ $this->errors = array('error' => 'Already connected to a server');
+ return FALSE;
}
- $this->Close();
- return false;
- }
- return true; // everything looks good
- }
- return false;
- }
-
- /**
- * Closes the socket and cleans up the state of the class.
- * It is not considered good to use this function without
- * first trying to use QUIT.
- * @access public
- * @return void
- */
- public function Close() {
- $this->error = null; // so there is no confusion
- $this->helo_rply = null;
- if(!empty($this->smtp_conn)) {
- // close the connection and cleanup
- fclose($this->smtp_conn);
- $this->smtp_conn = 0;
- }
- }
-
- /////////////////////////////////////////////////
- // SMTP COMMANDS
- /////////////////////////////////////////////////
-
- /**
- * Issues a data command and sends the msg_data to the server
- * finializing the mail transaction. $msg_data is the message
- * 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
- * and the message body being seperated by and additional <CRLF>.
- *
- * Implements rfc 821: DATA <CRLF>
- *
- * SMTP CODE INTERMEDIATE: 354
- * [data]
- * <CRLF>.<CRLF>
- * SMTP CODE SUCCESS: 250
- * SMTP CODE FAILURE: 552,554,451,452
- * SMTP CODE FAILURE: 451,554
- * SMTP CODE ERROR : 500,501,503,421
- * @access public
- * @return bool
- */
- public function Data($msg_data) {
- $this->error = null; // so no confusion is caused
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Data() without being connected");
- return false;
- }
-
- fputs($this->smtp_conn,"DATA" . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
- }
-
- if($code != 354) {
- $this->error =
- array("error" => "DATA command not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- /* the server is ready to accept data!
- * according to rfc 821 we should not send more than 1000
- * including the CRLF
- * 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
- * each of those into smaller lines to fit within the limit.
- * in addition we will be looking for lines that start with
- * a period '.' and append and additional period '.' to that
- * line. NOTE: this does not count towards limit.
- */
-
- // 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",$msg_data);
- $lines = explode("\n",$msg_data);
-
- /* we need to find a good way to determine is headers are
- * in the msg_data or if it is a straight msg body
- * currently I am assuming rfc 822 definitions of msg headers
- * and if the first field of the first line (':' sperated)
- * does not contain a space then it _should_ be a header
- * and we can process all lines before a blank "" line as
- * headers.
- */
-
- $field = substr($lines[0],0,strpos($lines[0],":"));
- $in_headers = false;
- if(!empty($field) && !strstr($field," ")) {
- $in_headers = true;
- }
-
- $max_line_length = 998; // used below; set here for ease in change
-
- while(list(,$line) = @each($lines)) {
- $lines_out = null;
- if($line == "" && $in_headers) {
- $in_headers = false;
- }
- // ok we need to break this line up into several smaller lines
- while(strlen($line) > $max_line_length) {
- $pos = strrpos(substr($line,0,$max_line_length)," ");
-
- // Patch to fix DOS attack
- if(!$pos) {
- $pos = $max_line_length - 1;
- $lines_out[] = substr($line,0,$pos);
- $line = substr($line,$pos);
- } else {
- $lines_out[] = substr($line,0,$pos);
- $line = substr($line,$pos + 1);
+ // connect to the smtp server
+ $this->smtp_conn = @fsockopen($host, $port, $errno, $errstr, $tval);
+ // verify we connected properly
+ if (empty($this->smtp_conn)) {
+ $this->errors = array(
+ 'error' => 'Failed to connect to server',
+ 'errno' => $errno,
+ 'errstr' => $errstr
+ );
+ if ($this->do_debug >= 1) {
+ echo 'SMTP -> ERROR: ' . $this->error['error'] . ": $errstr ($errno)" . Mailer::CRLF . '<br />';
+ }
+ return FALSE;
}
-
- /* if processing headers add a LWSP-char to the front of new line
- * rfc 822 on long msg headers
- */
- if($in_headers) {
- $line = "\t" . $line;
+ // SMTP server can take longer to respond, give longer timeout for first read
+ // Windows does not have support for this timeout function
+ if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') {
+ socket_set_timeout($this->smtp_conn, $tval, 0);
}
- }
- $lines_out[] = $line;
-
- // send the lines to the server
- while(list(,$line_out) = @each($lines_out)) {
- if(strlen($line_out) > 0)
- {
- if(substr($line_out, 0, 1) == ".") {
- $line_out = "." . $line_out;
- }
+ // get any announcement
+ $announce = $this->getLines();
+ if ($this->do_debug >= 2) {
+ echo 'SMTP -> FROM SERVER:' . $announce . Mailer::CRLF . '<br />';
}
- fputs($this->smtp_conn,$line_out . $this->CRLF);
- }
- }
-
- // message data has been sent
- fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
- }
-
- if($code != 250) {
- $this->error =
- array("error" => "DATA not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
- return true;
- }
-
- /**
- * Sends the HELO command to the smtp server.
- * This makes sure that we and the server are in
- * the same known state.
- *
- * Implements from rfc 821: HELO <SP> <domain> <CRLF>
- *
- * SMTP CODE SUCCESS: 250
- * SMTP CODE ERROR : 500, 501, 504, 421
- * @access public
- * @return bool
- */
- public function Hello($host = '') {
- $this->error = null; // so no confusion is caused
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Hello() without being connected");
- return false;
- }
-
- // if hostname for HELO was not specified send default
- if(empty($host)) {
- // determine appropriate default to send to server
- $host = "localhost";
- }
-
- // Send extended hello first (RFC 2821)
- if(!$this->SendHello("EHLO", $host)) {
- if(!$this->SendHello("HELO", $host)) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Sends a HELO/EHLO command.
- * @access private
- * @return bool
- */
- private function SendHello($hello, $host) {
- fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />';
- }
-
- if($code != 250) {
- $this->error =
- array("error" => $hello . " not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
-
- $this->helo_rply = $rply;
-
- return true;
- }
-
- /**
- * Starts a mail transaction from the email address specified in
- * $from. Returns true if successful or false otherwise. If True
- * the mail transaction is started and then one or more Recipient
- * commands may be called followed by a Data command.
- *
- * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
- *
- * SMTP CODE SUCCESS: 250
- * SMTP CODE SUCCESS: 552,451,452
- * SMTP CODE SUCCESS: 500,501,421
- * @access public
- * @return bool
- */
- public function Mail($from) {
- $this->error = null; // so no confusion is caused
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Mail() without being connected");
- return false;
- }
-
- $useVerp = ($this->do_verp ? "XVERP" : "");
- fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
- }
-
- if($code != 250) {
- $this->error =
- array("error" => "MAIL not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
- }
- return true;
- }
-
- /**
- * 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.
- *
- * Implements from rfc 821: QUIT <CRLF>
- *
- * SMTP CODE SUCCESS: 221
- * SMTP CODE ERROR : 500
- * @access public
- * @return bool
- */
- public function Quit($close_on_error = true) {
- $this->error = null; // so there is no confusion
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Quit() without being connected");
- return false;
- }
-
- // send the quit command to the server
- fputs($this->smtp_conn,"quit" . $this->CRLF);
-
- // get any good-bye messages
- $byemsg = $this->get_lines();
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />';
- }
-
- $rval = true;
- $e = null;
-
- $code = substr($byemsg,0,3);
- if($code != 221) {
- // use e as a tmp var cause Close will overwrite $this->error
- $e = array("error" => "SMTP server rejected quit command",
- "smtp_code" => $code,
- "smtp_rply" => substr($byemsg,4));
- $rval = false;
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />';
- }
+ return TRUE;
}
- if(empty($e) || $close_on_error) {
- $this->Close();
+ private function sendCommand($command, $success_code=self::COMMAND_OK, $check_connection=TRUE) {
+ if ($check_connection && !$this->connected()) {
+ $this->errors[] = array('error' => 'Trying command: ' . $command . ', but not connected');
+ return FALSE;
+ }
+ fputs($this->smtp_conn, $command . Mailer::CRLF);
+ $rply = $this->getLines();
+ $code = substr($rply, 0, 3);
+ if ($this->do_debug >= 2) {
+ echo 'SMTP -> FROM SERVER:' . $rply . Mailer::CRLF . '<br />';
+ }
+ $success_code = is_array($success_code) ? $success_code : array($success_code);
+ $ok = TRUE;
+ foreach ($success_code as $sc) {
+ if ($code != $sc) {
+ $ok = FALSE;
+ break;
+ }
+ }
+ if (!$ok) {
+ $this->errors[] = array(
+ 'error' => 'COMMAND: "' . $command . '" failed',
+ 'smtp_code' => $code,
+ 'smtp_msg' => substr($rply, 4)
+ );
+ if ($this->do_debug >= 1) {
+ echo 'SMTP -> ERROR: ' . $this->error['error'] . ': ' . $rply . Mailer::CRLF . '<br />';
+ }
+ return FALSE;
+ }
+ $this->cmd_reply = $rply;
+ return TRUE;
+ }
+
+ public function startTls() {
+ $result = $this->sendCommand('STARTTLS', 220);
+ if ($result) {
+ return stream_socket_enable_crypto($this->smtp_conn, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ }
+ return $result;
}
- return $rval;
- }
-
- /**
- * 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.
- *
- * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
- *
- * SMTP CODE SUCCESS: 250,251
- * SMTP CODE FAILURE: 550,551,552,553,450,451,452
- * SMTP CODE ERROR : 500,501,503,421
- * @access public
- * @return bool
- */
- public function Recipient($to) {
- $this->error = null; // so no confusion is caused
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Recipient() without being connected");
- return false;
+ public function authenticate($username, $password) {
+ // Start authentication
+ if ($this->sendCommand('AUTH LOGIN', 334, FALSE)) {
+ if ($this->sendCommand(base64_encode($username), 334, FALSE)) {
+ return $this->sendCommand(base64_encode($password), 235, FALSE);
+ }
+ }
+ return FALSE;
+ }
+
+ public function connected() {
+ if (!empty($this->smtp_conn)) {
+ $sock_status = socket_get_status($this->smtp_conn);
+ if ($sock_status['eof']) {
+ // the socket is valid but we are not connected
+ if ($this->do_debug >= 1) {
+ echo 'SMTP -> NOTICE:' . Mailer::CRLF . 'EOF caught while checking if connected';
+ }
+ $this->close();
+ return FALSE;
+ }
+ return TRUE; // everything looks good
+ }
+ return FALSE;
}
- fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+ public function close() {
+ $this->errors = NULL; // so there is no confusion
+ $this->helo_rply = NULL;
+ if (!empty($this->smtp_conn)) {
+ // close the connection and cleanup
+ fclose($this->smtp_conn);
+ $this->smtp_conn = 0;
+ }
}
- if($code != 250 && $code != 251) {
- $this->error =
- array("error" => "RCPT not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
+ public function data($msg_data) {
+ if ($this->sendCommand('DATA', 354)) {
+ $msg_data = str_replace("\r\n", "\n", $msg_data);
+ $msg_data = str_replace("\r", "\n", $msg_data);
+ $lines = explode("\n", $msg_data);
+ $field = substr($lines[0], 0, strpos($lines[0], ':'));
+ $in_headers = (!empty($field) && !strstr($field, ' '));
+ $max_line_length = 998; // used below; set here for ease in change
+ while (list(, $line) = @each($lines)) {
+ $lines_out = NULL;
+ if ($line == '' && $in_headers) {
+ $in_headers = FALSE;
+ }
+ // ok we need to break this line up into several smaller lines
+ while (strlen($line) > $max_line_length) {
+ $pos = strrpos(substr($line, 0, $max_line_length), ' ');
+ // Patch to fix DOS attack
+ if (!$pos) {
+ $pos = $max_line_length - 1;
+ $lines_out[] = substr($line, 0, $pos);
+ $line = substr($line, $pos);
+ } else {
+ $lines_out[] = substr($line, 0, $pos);
+ $line = substr($line, $pos + 1);
+ }
+ /* if processing headers add a LWSP-char to the front of new line
+ * rfc 822 on long msg headers
+ */
+ if ($in_headers) {
+ $line = ' ' . $line;
+ }
+ }
+ $lines_out[] = $line;
+ // send the lines to the server
+ while (list(, $line_out) = @each($lines_out)) {
+ if (strlen($line_out) > 0) {
+ if (substr($line_out, 0, 1) == ' . ') {
+ $line_out = ' . ' . $line_out;
+ }
+ }
+ fputs($this->smtp_conn, $line_out . Mailer::CRLF);
+ }
+ }
+ // message data has been sent
+ return $this->sendCommand(Mailer::CRLF . ' . ');
+ }
+ return FALSE;
}
- return true;
- }
-
- /**
- * Sends the RSET command to abort and transaction that is
- * currently in progress. Returns true if successful false
- * otherwise.
- *
- * Implements rfc 821: RSET <CRLF>
- *
- * SMTP CODE SUCCESS: 250
- * SMTP CODE ERROR : 500,501,504,421
- * @access public
- * @return bool
- */
- public function Reset() {
- $this->error = null; // so no confusion is caused
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called Reset() without being connected");
- return false;
+ public function hello($host='localhost') {
+ $this->errors = NULL; // so no confusion is caused
+ if (!$this->connected()) {
+ $this->errors = array('error' => 'Called hello() without being connected');
+ return FALSE;
+ }
+ // Send extended hello first (RFC 2821)
+ if (!$this->sendHello('EHLO', $host)) {
+ if (!$this->sendHello('HELO', $host)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
}
- fputs($this->smtp_conn,"RSET" . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+ private function sendHello($hello, $host='localhost') {
+ $result = $this->sendCommand("$hello $host", self::COMMAND_OK, FALSE);
+ if ($result) {
+ $this->helo_rply = $this->cmd_reply;
+ }
+ return $result;
}
- if($code != 250) {
- $this->error =
- array("error" => "RSET failed",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
+ public function mail($from) {
+ return $this->sendCommand('MAIL FROM:<' . $from . '>' . ($this->do_verp ? 'XVERP' : ''));
}
- return true;
- }
-
- /**
- * Starts a mail transaction from the email address specified in
- * $from. Returns true if successful or false otherwise. If True
- * the mail transaction is started and then one or more Recipient
- * commands may be called followed by a Data command. This command
- * will send the message to the users terminal if they are logged
- * in and send them an email.
- *
- * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
- *
- * SMTP CODE SUCCESS: 250
- * SMTP CODE SUCCESS: 552,451,452
- * SMTP CODE SUCCESS: 500,501,502,421
- * @access public
- * @return bool
- */
- public function SendAndMail($from) {
- $this->error = null; // so no confusion is caused
-
- if(!$this->connected()) {
- $this->error = array(
- "error" => "Called SendAndMail() without being connected");
- return false;
+ public function quit($close_on_error=TRUE) {
+ $result = $this->sendCommand('quit', 221);
+ if ($close_on_error && !$result) {
+ $this->close();
+ }
+ return $rval;
}
- fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
-
- $rply = $this->get_lines();
- $code = substr($rply,0,3);
-
- if($this->do_debug >= 2) {
- echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';
+ public function recipient($to) {
+ return $this->sendCommand('RCPT TO:<' . $to . '>', array(250, 251));
}
- if($code != 250) {
- $this->error =
- array("error" => "SAML not accepted from server",
- "smtp_code" => $code,
- "smtp_msg" => substr($rply,4));
- if($this->do_debug >= 1) {
- echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';
- }
- return false;
+ public function reset() {
+ return $this->sendCommand('RSET');
}
- return true;
- }
- /**
- * This is an optional command for SMTP that this class does not
- * support. This method is here to make the RFC821 Definition
- * complete for this class and __may__ be implimented in the future
- *
- * Implements from rfc 821: TURN <CRLF>
- *
- * SMTP CODE SUCCESS: 250
- * SMTP CODE FAILURE: 502
- * SMTP CODE ERROR : 500, 503
- * @access public
- * @return bool
- */
- public function Turn() {
- $this->error = array("error" => "This method, TURN, of the SMTP ".
- "is not implemented");
- if($this->do_debug >= 1) {
- echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />';
- }
- return false;
- }
+ public function sendAndMail($from) { return $this->sendCommand('SAML FROM:' . $from); }
- /**
- * Get the current error
- * @access public
- * @return array
- */
- public function getError() {
- return $this->error;
- }
+ public function turn() { return $this->sendCommand('TURN'); }
- /////////////////////////////////////////////////
- // INTERNAL FUNCTIONS
- /////////////////////////////////////////////////
+ public function getErrors() { return $this->errors; }
- /**
- * Read in as many lines as possible
- * either before eof or socket timeout occurs on the operation.
- * 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
- * need to read anything else.
- * @access private
- * @return string
- */
- private function get_lines() {
- $data = "";
- while(!feof($this->smtp_conn)) {
- $str = @fgets($this->smtp_conn,515);
- if($this->do_debug >= 4) {
- echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />';
- echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />';
- }
- $data .= $str;
- if($this->do_debug >= 4) {
- echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />';
- }
- // if 4th character is a space, we are done reading, break the loop
- if(substr($str,3,1) == " ") { break; }
+ private function getLines() {
+ $data = '';
+ while (!feof($this->smtp_conn)) {
+ $str = @fgets($this->smtp_conn,515);
+ if ($this->do_debug >= 4) {
+ echo "SMTP -> get_lines(): \$data was \"$data\"" . Mailer::CRLF . '<br />';
+ echo "SMTP -> get_lines(): \$str is \"$str\"" . Mailer::CRLF . '<br />';
+ }
+ $data .= $str;
+ if ($this->do_debug >= 4) {
+ echo "SMTP -> get_lines(): \$data is \"$data\"" . Mailer::CRLF . '<br />';
+ }
+ // if 4th character is a space, we are done reading, break the loop
+ if (substr($str, 3, 1) == ' ') { break; }
+ }
+ return $data;
}
- return $data;
- }
}
View
42 examples/test_db_smtp_basic.php
@@ -11,26 +11,26 @@
date_default_timezone_set('America/Toronto');
-require_once('../class.phpmailer.php');
+require_once(' ../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
$mail = new PHPMailer();
$body = file_get_contents('contents.html');
-$body = eregi_replace("[\]",'',$body);
-
-$mail->IsSMTP(); // telling the class to use SMTP
-$mail->Host = "smtp1.site.com;smtp2.site.com";
-$mail->SMTPAuth = true; // enable SMTP authentication
-$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent
-$mail->Host = "mail.yourdomain.com"; // sets the SMTP server
-$mail->Port = 26; // set the SMTP port for the GMAIL server
-$mail->Username = "yourname@yourdomain"; // SMTP account username
+$body = eregi_replace("[\]",'', $body);
+
+$mail->useSmtp(); // telling the class to use SMTP
+$mail->host = "smtp1.site.com;smtp2.site.com";
+$mail->smtp_auth = TRUE; // enable SMTP authentication
+$mail->smtp_keep_alive = TRUE; // SMTP connection will not close after each email sent
+$mail->host = "mail.yourdomain.com"; // sets the SMTP server
+$mail->port = 26; // set the SMTP port for the GMAIL server
+$mail->username = "yourname@yourdomain"; // SMTP account username
$mail->Password = "yourpassword"; // SMTP account password
-$mail->SetFrom('list@mydomain.com', 'List manager');
-$mail->AddReplyTo('list@mydomain.com', 'List manager');
+$mail->setFrom('list@mydomain.com', 'List manager');
+$mail->addReplyTo('list@mydomain.com', 'List manager');
-$mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication";
+$mail->subject = "PHPMailer Test Subject via smtp, basic with authentication";
@MYSQL_CONNECT("localhost","root","password");
@mysql_select_db("my_company");
@@ -38,19 +38,19 @@
$result = @MYSQL_QUERY($query);
while ($row = mysql_fetch_array ($result)) {
- $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
- $mail->MsgHTML($body);
- $mail->AddAddress($row["email"], $row["full_name"]);
- $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");
+ $mail->alt_body = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
+ $mail->msgHtml($body);
+ $mail->addAddress($row["email"], $row["full_name"]);
+ $mail->addStringAttachment($row["photo"], "YourPhoto.jpg");
- if(!$mail->Send()) {
- echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />';
+ if (!$mail->send()) {
+ echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->error_info . '<br />';
} else {
echo "Message sent to :" . $row["full_name"] . ' (' . str_replace("@", "&#64;", $row["email"]) . ')<br />';
}
// Clear all addresses and attachments for next loop
- $mail->ClearAddresses();
- $mail->ClearAttachments();
+ $mail->clearAddresses();
+ $mail->clearAttachments();
}
?>
View
26 examples/test_mail_advanced.php
@@ -5,23 +5,23 @@
<body>
<?php
-require_once '../class.phpmailer.php';
+require_once ' ../class.phpmailer.php';
-$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch
+$mail = new PHPMailer(TRUE); //defaults to using php "mail()"; the TRUE param means it will throw exceptions on errors, which we need to catch
try {
- $mail->AddReplyTo('name@yourdomain.com', 'First Last');
- $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
- $mail->SetFrom('name@yourdomain.com', 'First Last');
- $mail->AddReplyTo('name@yourdomain.com', 'First Last');
- $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
- $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
- $mail->MsgHTML(file_get_contents('contents.html'));
- $mail->AddAttachment('images/phpmailer.gif'); // attachment
- $mail->AddAttachment('images/phpmailer_mini.gif'); // attachment