fetchOne("SELECT * FROM email WHERE id = ? AND is_deleted = 0", [$id]); echo json_encode(['success' => true, 'data' => ['email' => $email]]); exit; } if ($username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; } $page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1; $perPage = isset($_GET['perPage']) ? min(100, max(1, (int)$_GET['perPage'])) : 10; $offset = ($page - 1) * $perPage; $totalRow = $db->fetchOne("SELECT COUNT(*) AS cnt FROM email WHERE rcpt_to = ? AND is_deleted = 0", [$username]); $emails = $db->fetchAll("SELECT id, `from`, `to`, subject, `date`, folder, is_read, is_deleted, created_at FROM email WHERE rcpt_to = ? AND is_deleted = 0 ORDER BY `date` DESC LIMIT $perPage OFFSET $offset", [$username]); echo json_encode(['success' => true, 'data' => ['emails' => $emails, 'total' => (int)$totalRow['cnt'], 'page' => $page, 'perPage' => $perPage, 'totalPages' => (int)ceil(((int)$totalRow['cnt']) / $perPage)]]); exit; } if ($method === 'POST') { $input = json_decode(file_get_contents('php://input'), true); $username = trim($input['username'] ?? ''); $to = trim($input['to'] ?? ''); $subject = trim($input['subject'] ?? ''); $content = $input['content'] ?? ''; $isDraft = isset($input['isDraft']) ? (bool)$input['isDraft'] : false; if ($username === '' || $to === '' || !Helper::validateEmail($to)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; } $user = $db->fetchOne("SELECT email FROM user WHERE username = ? AND is_deleted = 0", [$username]); $fromEmail = $user ? $user['email'] : ($username . '@test.com'); $id = Helper::generateId(); $folder = $isDraft ? 'draft' : 'sent'; $dateNow = date('Y-m-d H:i:s'); $raw = "From: {$fromEmail}\r\nTo: {$to}\r\nSubject: {$subject}\r\nDate: {$dateNow}\r\n\r\n{$content}\r\n"; $db->insert("INSERT INTO email (id, ip, helo, mail_from, rcpt_to, `from`, `to`, subject, `date`, `data`, datagram, `length`, `state`, is_read, folder, created_at, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), 0)", [$id, Helper::getClientIp(), 'frontend', $fromEmail, $username, $fromEmail, $to, $subject, $dateNow, $content, $raw, strlen($raw), 1, $isDraft ? 0 : 1, $folder]); echo json_encode(['success' => true, 'message' => ($isDraft ? 'draft saved' : 'sent'), 'data' => ['emailId' => $id]]); exit; } if ($method === 'PUT') { $input = json_decode(file_get_contents('php://input'), true); $id = trim($input['id'] ?? ''); $username = trim($input['username'] ?? ''); $isRead = isset($input['isRead']) ? (int)$input['isRead'] : null; $folder = isset($input['folder']) ? trim($input['folder']) : null; if ($id === '' || $username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; } $fields = []; $params = []; if ($isRead !== null) { $fields[] = "is_read = ?"; $params[] = $isRead; } if ($folder !== null) { $fields[] = "folder = ?"; $params[] = $folder; } if (empty($fields)) { echo json_encode(['success' => true, 'message' => 'no changes']); exit; } $params[] = $id; $params[] = $username; $db->update("UPDATE email SET " . implode(', ', $fields) . " WHERE id = ? AND rcpt_to = ?", $params); echo json_encode(['success' => true, 'message' => 'updated']); exit; } if ($method === 'DELETE') { $id = isset($_GET['id']) ? trim($_GET['id']) : ''; $username = isset($_GET['username']) ? trim($_GET['username']) : ''; if ($id === '' || $username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; } $db->update("UPDATE email SET is_deleted = 1, folder = 'trash' WHERE id = ? AND rcpt_to = ?", [$id, $username]); echo json_encode(['success' => true, 'message' => 'deleted']); exit; } http_response_code(405); echo json_encode(['success' => false, 'message' => 'method not allowed']);