103 lines
3.5 KiB
PHP
Executable File
103 lines
3.5 KiB
PHP
Executable File
|
|
<?php
|
|
header('Content-Type: application/json');
|
|
|
|
class SMTPTester {
|
|
public function test($host, $port, $user = null, $pass = null, $encryption = 'tls') {
|
|
$result = ['host' => $host, 'port' => $port, 'success' => false, 'error' => '', 'response' => ''];
|
|
|
|
$context = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);
|
|
|
|
if ($encryption == 'ssl') {
|
|
$socket = @stream_socket_client("ssl://$host:$port", $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
|
|
} else {
|
|
$socket = @stream_socket_client("tcp://$host:$port", $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
|
|
}
|
|
|
|
if (!$socket) {
|
|
$result['error'] = "Connection failed: $errstr";
|
|
return $result;
|
|
}
|
|
|
|
$response = fgets($socket, 1024);
|
|
$result['response'] = $response;
|
|
|
|
if (strpos($response, '220') === false) {
|
|
$result['error'] = 'Invalid greeting';
|
|
fclose($socket);
|
|
return $result;
|
|
}
|
|
|
|
// EHLO
|
|
fwrite($socket, "EHLO test.local\r\n");
|
|
$ehlo = '';
|
|
while ($line = fgets($socket, 1024)) {
|
|
$ehlo .= $line;
|
|
if (substr($line, 3, 1) == ' ') break;
|
|
}
|
|
$result['ehlo'] = $ehlo;
|
|
|
|
// STARTTLS if needed
|
|
if ($encryption == 'tls' && strpos($ehlo, 'STARTTLS') !== false) {
|
|
fwrite($socket, "STARTTLS\r\n");
|
|
fgets($socket, 1024);
|
|
stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
|
|
fwrite($socket, "EHLO test.local\r\n");
|
|
while ($line = fgets($socket, 1024)) {
|
|
if (substr($line, 3, 1) == ' ') break;
|
|
}
|
|
}
|
|
|
|
// AUTH if credentials
|
|
if ($user && $pass) {
|
|
fwrite($socket, "AUTH LOGIN\r\n");
|
|
$auth1 = fgets($socket, 1024);
|
|
if (strpos($auth1, '334') !== false) {
|
|
fwrite($socket, base64_encode($user) . "\r\n");
|
|
fgets($socket, 1024);
|
|
fwrite($socket, base64_encode($pass) . "\r\n");
|
|
$authResult = fgets($socket, 1024);
|
|
$result['auth'] = strpos($authResult, '235') !== false ? 'success' : 'failed';
|
|
}
|
|
}
|
|
|
|
fwrite($socket, "QUIT\r\n");
|
|
fclose($socket);
|
|
|
|
$result['success'] = true;
|
|
return $result;
|
|
}
|
|
|
|
public function checkPort($host, $port) {
|
|
$socket = @fsockopen($host, $port, $errno, $errstr, 5);
|
|
if ($socket) {
|
|
fclose($socket);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$action = $_GET['action'] ?? $_POST['action'] ?? '';
|
|
$tester = new SMTPTester();
|
|
|
|
switch ($action) {
|
|
case 'test':
|
|
echo json_encode($tester->test($_POST['host'], $_POST['port'] ?? 587, $_POST['user'] ?? null, $_POST['pass'] ?? null, $_POST['encryption'] ?? 'tls'));
|
|
break;
|
|
case 'check_port':
|
|
echo json_encode(['open' => $tester->checkPort($_POST['host'], $_POST['port'] ?? 25)]);
|
|
break;
|
|
case 'quick':
|
|
$host = $_POST['host'];
|
|
$results = [];
|
|
foreach ([25, 465, 587, 2525] as $port) {
|
|
$results[$port] = $tester->checkPort($host, $port);
|
|
}
|
|
echo json_encode(['host' => $host, 'ports' => $results]);
|
|
break;
|
|
default:
|
|
echo json_encode(['actions' => ['test', 'check_port', 'quick']]);
|
|
}
|
|
|