Example #1
0
 function connect($host = null, $port = null, $user = null, $pass = null, $vssl = null, $tout = null, $name = null, $context = null, $login = null, $debug = null)
 {
     if (!FUNC4::is_debug($debug)) {
         $debug = debug_backtrace();
     }
     global $_RESULT;
     $_RESULT = $err = array();
     $_smtp = new SMTP4();
     if ($port == null) {
         $port = $_smtp->PORT;
     }
     if ($tout == null) {
         $tout = $_smtp->TOUT;
     }
     if (!is_string($host)) {
         $err[] = 'invalid host type';
     } else {
         $host = strtolower(trim($host));
         if (!($host != '' && ($host == 'localhost' || FUNC4::is_ipv4($host) || FUNC4::is_hostname($host, true, $debug)))) {
             $err[] = 'invalid host value';
         }
     }
     if (!(is_int($port) && $port > 0)) {
         $err[] = 'invalid port value';
     }
     if ($user != null) {
         if (!is_string($user)) {
             $err[] = 'invalid username type';
         } else {
             if (($user = FUNC4::str_clear($user)) == '') {
                 $err[] = 'invalid username value';
             }
         }
     }
     if ($pass != null) {
         if (!is_string($pass)) {
             $err[] = 'invalid password type';
         } else {
             if (($pass = FUNC4::str_clear($pass)) == '') {
                 $err[] = 'invalid password value';
             }
         }
     }
     if ($user != null && $pass == null || $user == null && $pass != null) {
         $err[] = 'invalid username/password combination';
     }
     if ($vssl != null) {
         if (!is_string($vssl)) {
             $err[] = 'invalid ssl version type';
         } else {
             $vssl = strtolower($vssl);
             if (!($vssl == 'tls' || $vssl == 'ssl' || $vssl == 'sslv2' || $vssl == 'sslv3')) {
                 $err[] = 'invalid ssl version value';
             }
         }
     }
     if (!(is_int($tout) && $tout > 0)) {
         $err[] = 'invalid timeout value';
     }
     if ($name != null) {
         if (!is_string($name)) {
             $err[] = 'invalid name type';
         } else {
             $name = strtolower(trim($name));
             if (!($name != '' && ($name == 'localhost' || FUNC4::is_ipv4($name) || FUNC4::is_hostname($name, true, $debug)))) {
                 $err[] = 'invalid name value';
             }
         }
     } else {
         $name = '127.0.0.1';
     }
     if ($context != null && !is_resource($context)) {
         $err[] = 'invalid context type';
     }
     if ($login != null) {
         $login = strtolower(trim($login));
         if (!($login == 'login' || $login == 'plain' || $login == 'cram-md5')) {
             $err[] = 'invalid authentication type value';
         }
     }
     if (count($err) > 0) {
         FUNC4::trace($debug, implode(', ', $err));
     } else {
         $ret = false;
         $prt = $vssl == null ? 'tcp' : $vssl;
         $conn = $context == null ? fsockopen($prt . '://' . $host, $port, $errno, $errstr, $tout) : fsockopen($prt . '://' . $host, $port, $errno, $errstr, $tout, $context);
         if (!$conn) {
             $_RESULT[101] = $errstr;
         } else {
             if (!socket_set_timeout($conn, $_smtp->COUT)) {
                 $_RESULT[102] = 'could not set socket timeout';
             } else {
                 if (!SMTP4::_cres($conn, $resp, 220, null, $debug)) {
                     $_RESULT[103] = $resp;
                 } else {
                     $continue = true;
                     if (!SMTP4::ehlo($conn, $name, $debug)) {
                         $continue = SMTP4::helo($conn, $name, $debug);
                     }
                     if ($continue) {
                         if ($user == null) {
                             $ret = true;
                         } else {
                             if ($login != null) {
                                 $ret = SMTP4::auth($conn, $user, $pass, $login, $debug);
                             } else {
                                 list($code, $arr) = each($_RESULT);
                                 $auth['default'] = $auth['login'] = $auth['plain'] = $auth['cram-md5'] = false;
                                 foreach ($arr as $line) {
                                     if (substr($line, 0, strlen('250-AUTH ')) == '250-AUTH ') {
                                         foreach (explode(' ', substr($line, strlen('250-AUTH '))) as $type) {
                                             $type = strtolower(trim($type));
                                             if ($type == 'login' || $type == 'plain' || $type == 'cram-md5') {
                                                 $auth[$type] = true;
                                             }
                                         }
                                     } else {
                                         if (substr($line, 0, strlen('250 AUTH=')) == '250 AUTH=') {
                                             $expl = explode(' ', strtolower(trim(substr($line, strlen('250 AUTH=')))), 2);
                                             if ($expl[0] == 'login' || $expl[0] == 'plain' || $expl[0] == 'cram-md5') {
                                                 $auth['default'] = $expl[0];
                                             }
                                         }
                                     }
                                 }
                                 if ($auth['default']) {
                                     $ret = SMTP4::auth($conn, $user, $pass, $auth['default'], $debug);
                                 }
                                 if (!$ret && $auth['login'] && $auth['default'] != 'login') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'login', $debug);
                                 }
                                 if (!$ret && $auth['plain'] && $auth['default'] != 'plain') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'plain', $debug);
                                 }
                                 if (!$ret && $auth['cram-md5'] && $auth['default'] != 'cram-md5') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'cram-md5', $debug);
                                 }
                                 if (!$ret && !$auth['login'] && $auth['default'] != 'login') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'login', $debug);
                                 }
                                 if (!$ret && !$auth['plain'] && $auth['default'] != 'plain') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'plain', $debug);
                                 }
                                 if (!$ret && !$auth['cram-md5'] && $auth['default'] != 'cram-md5') {
                                     $ret = SMTP4::auth($conn, $user, $pass, 'cram-md5', $debug);
                                 }
                             }
                         }
                     }
                 }
             }
         }
         if (!$ret) {
             if (is_resource($conn)) {
                 SMTP4::disconnect($conn, $debug);
             }
             $conn = false;
         }
         return $conn;
     }
 }