Files
wevads-platform/scripts/scripts_brain-pipeline-unblock.php
2026-02-26 04:53:11 +01:00

204 lines
11 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
/**
* BRAIN PIPELINE UNBLOCKER
* 1. Verify seed factory IMAP accounts
* 2. Promote verified seeds to brain_seeds
* 3. Run a test send cycle
*/
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "=== BRAIN PIPELINE UNBLOCKER ===\n\n";
// ═══════════════════════════════════════
// STEP 1: Verify Seed Factory IMAP
// ═══════════════════════════════════════
echo "── STEP 1: Verify Seed Factory IMAP ──\n";
$accounts = $pdo->query("SELECT * FROM admin.seed_factory_accounts WHERE status='created'")->fetchAll(PDO::FETCH_ASSOC);
$verified = 0; $failed = 0;
foreach ($accounts as $a) {
$connStr = "{{$a['imap_host']}:{$a['imap_port']}/imap/ssl/novalidate-cert}INBOX";
$imap = @imap_open($connStr, $a['email'], $a['password'], 0, 1, ['DISABLE_AUTHENTICATOR' => 'GSSAPI']);
if ($imap) {
$numMsg = imap_num_msg($imap);
imap_close($imap);
$pdo->prepare("UPDATE admin.seed_factory_accounts SET status='verified', last_check_at=NOW() WHERE id=?")->execute([$a['id']]);
echo "{$a['email']} ({$a['isp']}) - $numMsg msgs\n";
$verified++;
} else {
$err = imap_last_error() ?: 'Unknown error';
$pdo->prepare("UPDATE admin.seed_factory_accounts SET check_error=?, last_check_at=NOW() WHERE id=?")->execute([$err, $a['id']]);
echo "{$a['email']}: $err\n";
$failed++;
}
}
echo " Verified: $verified, Failed: $failed\n\n";
// ═══════════════════════════════════════
// STEP 2: Promote all verified → active → brain_seeds
// ═══════════════════════════════════════
echo "── STEP 2: Promote Seeds ──\n";
// Move verified directly to active (skip newsletter requirement for now)
$pdo->exec("UPDATE admin.seed_factory_accounts SET status='active' WHERE status='verified'");
$active = $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='active'")->fetchColumn();
echo " Active factory accounts: $active\n";
// Promote active factory accounts to brain_seeds
$ready = $pdo->query("SELECT * FROM admin.seed_factory_accounts WHERE status='active'")->fetchAll(PDO::FETCH_ASSOC);
$promoted = 0;
foreach ($ready as $a) {
$stmt = $pdo->prepare("INSERT INTO admin.brain_seeds (email, password, isp, imap_host, imap_port, is_active, check_status, source) VALUES (?,?,?,?,?,true,'valid','seed_factory') ON CONFLICT DO NOTHING");
try {
$stmt->execute([$a['email'], $a['imap_password'] ?: $a['password'], $a['isp'], $a['imap_host'], $a['imap_port']]);
if ($stmt->rowCount()) {
$pdo->exec("UPDATE admin.seed_factory_accounts SET status='promoted' WHERE id={$a['id']}");
$promoted++;
}
} catch (Exception $e) {
echo "{$a['email']}: {$e->getMessage()}\n";
}
}
echo " Promoted to brain_seeds: $promoted\n\n";
// ═══════════════════════════════════════
// STEP 3: Fix seeds without IMAP info
// ═══════════════════════════════════════
echo "── STEP 3: Enrich Seeds with IMAP ──\n";
$imapMap = [
'GMAIL' => ['imap.gmail.com', 993],
'HOTMAIL' => ['outlook.office365.com', 993],
'MICROSOFT' => ['outlook.office365.com', 993],
'OUTLOOK' => ['outlook.office365.com', 993],
'GMX' => ['imap.gmx.net', 993],
'T-ONLINE' => ['secureimap.t-online.de', 993],
'YAHOO' => ['imap.mail.yahoo.com', 993],
'ORANGE' => ['imap.orange.fr', 993],
'SFR' => ['imap.sfr.fr', 993],
'FREE' => ['imap.free.fr', 993],
'ZIGGO' => ['imap.ziggo.nl', 993],
];
$enriched = 0;
foreach ($imapMap as $isp => [$host, $port]) {
$r = $pdo->prepare("UPDATE admin.brain_seeds SET imap_host=?, imap_port=? WHERE UPPER(isp)=? AND (imap_host IS NULL OR imap_host='') AND is_active=true");
$r->execute([$host, $port, $isp]);
$enriched += $r->rowCount();
}
echo " Enriched IMAP info: $enriched seeds\n\n";
// ═══════════════════════════════════════
// STEP 4: Quick PMTA test send
// ═══════════════════════════════════════
echo "── STEP 4: Test PMTA Send ──\n";
$config = $pdo->query("SELECT * FROM admin.brain_configs WHERE is_active=true ORDER BY RANDOM() LIMIT 1")->fetch(PDO::FETCH_ASSOC);
if ($config) {
$seed = $pdo->query("SELECT email FROM admin.brain_seeds WHERE is_active=true AND password IS NOT NULL AND password!='' ORDER BY RANDOM() LIMIT 1")->fetch(PDO::FETCH_ASSOC);
if ($seed) {
$socket = @fsockopen('127.0.0.1', 25, $errno, $errstr, 5);
if ($socket) {
fgets($socket, 512);
$cmds = ["EHLO wevads.com\r\n", "MAIL FROM:<test@wevads.com>\r\n", "RCPT TO:<{$seed['email']}>\r\n", "DATA\r\n"];
foreach ($cmds as $cmd) { fwrite($socket, $cmd); fgets($socket, 512); }
$subject = "Brain Pipeline Test " . date('H:i:s');
$msg = "From: Brain Test <test@wevads.com>\r\nTo: {$seed['email']}\r\nSubject: $subject\r\nContent-Type: text/html\r\nX-Brain-Config: {$config['id']}\r\n\r\n<p>Pipeline test {$config['isp_target']} - {$config['send_method']}</p>\r\n.\r\n";
fwrite($socket, $msg);
$resp = fgets($socket, 512);
fwrite($socket, "QUIT\r\n");
fclose($socket);
$ok = strpos($resp, '250') !== false;
echo " Config #{$config['id']} ({$config['isp_target']}) → {$seed['email']}: " . ($ok ? "✅ SENT" : "$resp") . "\n";
// Log it
$pdo->prepare("INSERT INTO admin.brain_learning_log (event_type, data, lesson_learned, created_at) VALUES ('pipeline_test', ?, ?, NOW())")
->execute([json_encode(['config' => $config['id'], 'seed' => $seed['email']]), $ok ? 'PMTA send OK' : "Failed: $resp"]);
} else {
echo " ❌ PMTA port 25 unreachable\n";
}
} else {
echo " ⚠ No seeds with password\n";
}
} else {
echo " ⚠ No active brain_configs\n";
}
// ═══════════════════════════════════════
// STEP 5: Test O365 SMTP send
// ═══════════════════════════════════════
echo "\n── STEP 5: Test O365 SMTP Send ──\n";
$o365 = $pdo->query("SELECT admin_email, admin_password FROM admin.office_accounts WHERE status='Active' AND password_status='valid' AND admin_password IS NOT NULL AND admin_password!='' ORDER BY RANDOM() LIMIT 1")->fetch(PDO::FETCH_ASSOC);
$seedTarget = $pdo->query("SELECT email FROM admin.brain_seeds WHERE is_active=true AND UPPER(isp) IN ('GMX','T-ONLINE') AND password IS NOT NULL ORDER BY RANDOM() LIMIT 1")->fetch(PDO::FETCH_ASSOC);
if ($o365 && $seedTarget) {
$subject = "O365 Brain Test " . date('H:i:s');
$body = "<p>O365 Pipeline test " . date('Y-m-d H:i:s') . "</p>";
// PHPMailer-style SMTP
$smtp = @fsockopen('ssl://smtp.office365.com', 587, $errno, $errstr, 10);
if (!$smtp) {
// Try STARTTLS
$smtp = @fsockopen('smtp.office365.com', 587, $errno, $errstr, 10);
}
if ($smtp) {
$greeting = fgets($smtp, 512);
fwrite($smtp, "EHLO wevads.com\r\n");
while ($line = fgets($smtp, 512)) { if (substr($line, 3, 1) == ' ') break; }
fwrite($smtp, "STARTTLS\r\n");
$tlsResp = fgets($smtp, 512);
if (strpos($tlsResp, '220') !== false) {
stream_socket_enable_crypto($smtp, true, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
fwrite($smtp, "EHLO wevads.com\r\n");
while ($line = fgets($smtp, 512)) { if (substr($line, 3, 1) == ' ') break; }
// AUTH LOGIN
fwrite($smtp, "AUTH LOGIN\r\n");
fgets($smtp, 512);
fwrite($smtp, base64_encode($o365['admin_email']) . "\r\n");
fgets($smtp, 512);
fwrite($smtp, base64_encode($o365['admin_password']) . "\r\n");
$authResp = fgets($smtp, 512);
if (strpos($authResp, '235') !== false) {
echo " ✅ O365 AUTH OK: {$o365['admin_email']}\n";
fwrite($smtp, "MAIL FROM:<{$o365['admin_email']}>\r\n"); fgets($smtp, 512);
fwrite($smtp, "RCPT TO:<{$seedTarget['email']}>\r\n"); fgets($smtp, 512);
fwrite($smtp, "DATA\r\n"); fgets($smtp, 512);
$msg = "From: {$o365['admin_email']}\r\nTo: {$seedTarget['email']}\r\nSubject: $subject\r\nContent-Type: text/html\r\n\r\n$body\r\n.\r\n";
fwrite($smtp, $msg);
$sendResp = trim(fgets($smtp, 512));
$sent = strpos($sendResp, '250') !== false;
echo " " . ($sent ? "✅ O365 SENT" : "$sendResp") . "{$seedTarget['email']}\n";
} else {
echo " ❌ O365 AUTH FAIL: " . trim($authResp) . "\n";
}
}
fwrite($smtp, "QUIT\r\n");
fclose($smtp);
} else {
echo " ❌ Cannot connect to smtp.office365.com: $errstr\n";
}
} else {
echo " ⚠ No O365 account or seed available\n";
}
// ═══════════════════════════════════════
// FINAL SUMMARY
// ═══════════════════════════════════════
echo "\n── PIPELINE STATUS ──\n";
$stats = [
'seeds_active' => $pdo->query("SELECT COUNT(*) FROM admin.brain_seeds WHERE is_active=true")->fetchColumn(),
'seeds_with_pwd' => $pdo->query("SELECT COUNT(*) FROM admin.brain_seeds WHERE is_active=true AND password IS NOT NULL AND password!=''")->fetchColumn(),
'seeds_with_imap' => $pdo->query("SELECT COUNT(*) FROM admin.brain_seeds WHERE is_active=true AND imap_host IS NOT NULL AND imap_host!=''")->fetchColumn(),
'brain_configs' => $pdo->query("SELECT COUNT(*) FROM admin.brain_configs WHERE is_active=true")->fetchColumn(),
'send_configs' => $pdo->query("SELECT COUNT(*) FROM admin.brain_send_configs WHERE status='active'")->fetchColumn(),
'o365_usable' => $pdo->query("SELECT COUNT(*) FROM admin.office_accounts WHERE status='Active' AND password_status='valid' AND admin_password IS NOT NULL")->fetchColumn(),
'winners' => $pdo->query("SELECT COUNT(*) FROM admin.brain_winners WHERE is_active=true")->fetchColumn(),
'factory_promoted' => $pdo->query("SELECT COUNT(*) FROM admin.seed_factory_accounts WHERE status='promoted'")->fetchColumn(),
];
foreach ($stats as $k => $v) echo " $k: $v\n";
echo "\nDONE.\n";