$subject, 'score' => 100, 'issues' => [], 'suggestions' => []]; $lower = strtolower($subject); // Check spam words foreach ($this->spamWords as $word) { if (strpos($lower, $word) !== false) { $result['score'] -= 10; $result['issues'][] = "Contains spam trigger: '$word'"; } } // Check length $len = strlen($subject); if ($len > 60) { $result['score'] -= 10; $result['issues'][] = "Too long ($len chars). Keep under 60."; } elseif ($len < 20) { $result['score'] -= 5; $result['issues'][] = "Too short ($len chars). Aim for 30-50."; } // Check caps $caps = preg_match_all('/[A-Z]/', $subject, $m); $capsRatio = $caps / max(1, $len); if ($capsRatio > 0.3) { $result['score'] -= 15; $result['issues'][] = "Too many capital letters"; } // Check special chars if (preg_match('/[!]{2,}|[$]{2,}|[?]{2,}/', $subject)) { $result['score'] -= 10; $result['issues'][] = "Excessive punctuation"; } // Check emojis (sometimes good, sometimes bad) if (preg_match('/[\x{1F600}-\x{1F6FF}]/u', $subject)) { $result['suggestions'][] = "Contains emoji - test with and without"; } $result['score'] = max(0, $result['score']); $result['rating'] = $result['score'] >= 80 ? 'good' : ($result['score'] >= 50 ? 'moderate' : 'poor'); return $result; } public function encode($subject) { return '=?UTF-8?B?' . base64_encode($subject) . '?='; } } $action = $_GET['action'] ?? $_POST['action'] ?? ''; $tester = new SubjectTester(); switch ($action) { case 'analyze': echo json_encode($tester->analyze($_POST['subject'] ?? $_GET['subject'])); break; case 'encode': $subject = $_POST['subject'] ?? $_GET['subject']; echo json_encode(['original' => $subject, 'encoded' => $tester->encode($subject)]); break; case 'bulk': $subjects = explode("\n", $_POST['subjects'] ?? ''); $results = []; foreach ($subjects as $s) { if (trim($s)) $results[] = $tester->analyze(trim($s)); } echo json_encode(['results' => $results]); break; default: echo json_encode(['actions' => ['analyze', 'encode', 'bulk']]); }