Search code examples
phpemailsmtpphpmailer

PHP test SMTP config


Using PHPMailer http://phpmailer.worxware.com/index.php?pg=examples how can I test if my SMTP settings are working, without actually sending an email?

Edit: Maybe I should make this more generic, and just ask how I check a SMTP connction using PHP, without sending an email.


Solution

  • If you are using PHPMailer, you can use the Connect() method, before sending, and check for errors if the connection is not correct.

      /**
      * 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;
      }
    

    (From PHPMailer SVN)