PDO::ERRMODE_EXCEPTION]); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.ip_pool (id SERIAL PRIMARY KEY, ip_address VARCHAR(50) UNIQUE, provider VARCHAR(100), server_id INTEGER, ptr_record VARCHAR(255), warmup_day INTEGER DEFAULT 0, sends_today INTEGER DEFAULT 0, sends_total INTEGER DEFAULT 0, reputation INTEGER DEFAULT 100, status VARCHAR(50) DEFAULT 'warming')"); $action = $_POST['action'] ?? $_GET['action'] ?? ''; switch ($action) { case 'add': $stmt = $pdo->prepare("INSERT INTO admin.ip_pool (ip_address, provider, ptr_record) VALUES (?, ?, ?) ON CONFLICT (ip_address) DO NOTHING"); $stmt->execute([$_POST['ip'], $_POST['provider'] ?? '', $_POST['ptr'] ?? '']); echo json_encode(['success' => true]); break; case 'list': $ips = $pdo->query("SELECT * FROM admin.ip_pool ORDER BY warmup_day DESC, sends_today ASC")->fetchAll(PDO::FETCH_ASSOC); echo json_encode(['ips' => $ips]); break; case 'get_available': $minDay = intval($_POST['min_warmup_day'] ?? 30); $ip = $pdo->query("SELECT * FROM admin.ip_pool WHERE status = 'active' AND warmup_day >= $minDay ORDER BY sends_today ASC LIMIT 1")->fetch(PDO::FETCH_ASSOC); if ($ip) { $pdo->exec("UPDATE admin.ip_pool SET sends_today = sends_today + 1, sends_total = sends_total + 1 WHERE id = {$ip['id']}"); echo json_encode(['success' => true, 'ip' => $ip['ip_address']]); } else { echo json_encode(['success' => false, 'error' => 'No available IPs']); } break; case 'increment_warmup': $pdo->exec("UPDATE admin.ip_pool SET warmup_day = warmup_day + 1, sends_today = 0 WHERE status IN ('warming', 'active')"); $pdo->exec("UPDATE admin.ip_pool SET status = 'active' WHERE warmup_day >= 30 AND status = 'warming'"); echo json_encode(['success' => true]); break; case 'check_blacklist': $ip = $_POST['ip']; $rbls = ['zen.spamhaus.org', 'bl.spamcop.net', 'b.barracudacentral.org']; $reversed = implode('.', array_reverse(explode('.', $ip))); $listed = []; foreach ($rbls as $rbl) { $lookup = $reversed . '.' . $rbl; if (gethostbyname($lookup) != $lookup) $listed[] = $rbl; } $status = empty($listed) ? 'clean' : 'blacklisted'; $pdo->prepare("UPDATE admin.ip_pool SET status = ? WHERE ip_address = ?")->execute([$status == 'blacklisted' ? 'blacklisted' : 'active', $ip]); echo json_encode(['ip' => $ip, 'listed' => $listed, 'status' => $status]); break; case 'stats': echo json_encode([ 'total' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool")->fetchColumn(), 'warming' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'warming'")->fetchColumn(), 'active' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'active'")->fetchColumn(), 'blacklisted' => $pdo->query("SELECT COUNT(*) FROM admin.ip_pool WHERE status = 'blacklisted'")->fetchColumn(), 'by_provider' => $pdo->query("SELECT provider, COUNT(*) as count FROM admin.ip_pool GROUP BY provider")->fetchAll(PDO::FETCH_ASSOC) ]); break; default: echo json_encode(['actions' => ['add','list','get_available','increment_warmup','check_blacklist','stats']]); }