public function PHPMailer::smtpConnect

5.x PHPMailer.php public PHPMailer::smtpConnect($options = null)

Initiate a connection to an SMTP server. Returns false if the operation failed.

@uses \PHPMailer\PHPMailer\SMTP

Parameters

array $options An array of options compatible with stream_context_create():

Return value

bool

Throws

Exception

1 call to PHPMailer::smtpConnect()
PHPMailer::smtpSend in inc/PHPMailer/src/PHPMailer.php
Send mail via SMTP. Returns false if there is a bad MAIL FROM, RCPT, or DATA input.

File

inc/PHPMailer/src/PHPMailer.php, line 1881

Class

PHPMailer
PHPMailer - PHP email creation and transport class.

Namespace

PHPMailer\PHPMailer

Code

public function smtpConnect($options = null) 
 {
  if (null === $this->smtp) {
    $this->smtp = $this->getSMTPInstance();
  }

  //If no options are provided, use whatever is set in the instance
  if (null === $options) {
    $options = $this->SMTPOptions;
  }

  // Already connected?
  if ($this->smtp->connected()) {
    return true;
  }

  $this->smtp->setTimeout($this->Timeout);
  $this->smtp->setDebugLevel($this->SMTPDebug);
  $this->smtp->setDebugOutput($this->Debugoutput);
  $this->smtp->setVerp($this->do_verp);
  $hosts = explode(';', $this->Host);
  $lastexception = null;

  foreach ($hosts as $hostentry) {
    $hostinfo = [];
    if (!preg_match(
    '/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*|\[[a-fA-F0-9:]+\]):?([0-9]*)$/', 
    trim($hostentry), 
    $hostinfo
    )) {
      static::edebug($this->lang('connect_host') . ' ' . $hostentry);
      // Not a valid host entry
      continue;
    }
    // $hostinfo[2]: optional ssl or tls prefix
    // $hostinfo[3]: the hostname
    // $hostinfo[4]: optional port number
    // The host string prefix can temporarily override the current setting for SMTPSecure
    // If it's not specified, the default value is used

    //Check the host name is a valid name or IP address before trying to use it
    if (!static::isValidHost($hostinfo [3])) {
      static::edebug($this->lang('connect_host') . ' ' . $hostentry);
      continue;
    }
    $prefix = '';
    $secure = $this->SMTPSecure;
    $tls = ('tls' == $this->SMTPSecure);
    if ('ssl' == $hostinfo [2] or ('' == $hostinfo [2] and 'ssl' == $this->SMTPSecure)) {
      $prefix = 'ssl://';
      $tls = false; // Can't have SSL and TLS at the same time
      $secure = 'ssl';
    }
    elseif ('tls' == $hostinfo [2]) {
      $tls = true;
      // tls doesn't use a prefix
      $secure = 'tls';
    }
    //Do we need the OpenSSL extension?
    $sslext = defined('OPENSSL_ALGO_SHA256');
    if ('tls' === $secure or 'ssl' === $secure) {
      //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
      if (!$sslext) {
        throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL);
      }
    }
    $host = $hostinfo [3];
    $port = $this->Port;
    $tport = (int) $hostinfo [4];
    if ($tport > 0 and $tport < 65536) {
      $port = $tport;
    }
    if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
      try {
        if ($this->Helo) {
          $hello = $this->Helo;
        }
        else {
          $hello = $this->serverHostname();
        }
        $this->smtp->hello($hello);
        //Automatically enable TLS encryption if:
        // * it's not disabled
        // * we have openssl extension
        // * we are not already using SSL
        // * the server offers STARTTLS
        if ($this->SMTPAutoTLS and $sslext and 'ssl' != $secure and $this->smtp->getServerExt('STARTTLS')) {
          $tls = true;
        }
        if ($tls) {
          if (!$this->smtp->startTLS()) {
            throw new Exception($this->lang('connect_host'));
          }
          // We must resend EHLO after TLS negotiation
          $this->smtp->hello($hello);
        }
        if ($this->SMTPAuth) {
          if (!$this->smtp->authenticate(
          $this->Username, 
          $this->Password, 
          $this->AuthType, 
          $this->oauth
          )
          ) {
            throw new Exception($this->lang('authenticate'));
          }
        }

        return true;
      }
      catch (Exception $exc) {
        $lastexception = $exc;
        $this->edebug($exc->getMessage());
        // We must have connected, but then failed TLS or Auth, so close connection nicely
        $this->smtp->quit();
      }
    }
  }
  // If we get here, all connection attempts have failed, so close connection hard
  $this->smtp->close();
  // As we've caught all exceptions, just report whatever the last one was
  if ($this->exceptions and null !== $lastexception) {
    throw $lastexception;
  }

  return false;
}