Files
wevads-platform/scripts/api_smtp-tester.php
2026-02-26 04:53:11 +01:00

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']]);
}