0, 'time' => time()]; } $data = $_SESSION[$key]; if (time() - $data['time'] > 3600) { $_SESSION[$key] = ['count' => 0, 'time' => time()]; $data = $_SESSION[$key]; } if ($data['count'] >= 3) { return false; } return true; } // Input validation function validateInput($data, $type = 'text') { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); switch ($type) { case 'email': return filter_var($data, FILTER_VALIDATE_EMAIL) ? $data : false; case 'phone': return preg_match('/^[\+]?[0-9\s\-\(\)]+$/', $data) ? $data : false; case 'text': return strlen($data) > 0 ? $data : false; case 'long_text': return strlen($data) >= 20 ? $data : false; default: return $data; } } // Response function function sendResponse($success, $message, $data = null) { $response = [ 'success' => $success, 'message' => $message ]; if ($data !== null) { $response['data'] = $data; } echo json_encode($response); exit; } // Handle POST requests only if ($_SERVER['REQUEST_METHOD'] !== 'POST') { sendResponse(false, 'Invalid request method'); } // Check rate limiting if (!checkRateLimit()) { sendResponse(false, 'Too many requests. Please try again later.'); } // Validate and sanitize inputs $services = $_POST['services'] ?? []; $project_scale = validateInput($_POST['project_scale'] ?? '', 'text'); $timeline = validateInput($_POST['timeline'] ?? '', 'text'); $name = validateInput($_POST['name'] ?? '', 'text'); $email = validateInput($_POST['email'] ?? '', 'email'); $company = validateInput($_POST['company'] ?? '', 'text'); $phone = validateInput($_POST['phone'] ?? '', 'phone'); $data_sources = validateInput($_POST['data_sources'] ?? '', 'text'); $requirements = validateInput($_POST['requirements'] ?? '', 'long_text'); $budget = validateInput($_POST['budget'] ?? '', 'text'); // Validation $errors = []; if (empty($services) || !is_array($services)) { $errors[] = 'Please select at least one service'; } if (!$project_scale) { $errors[] = 'Please select a project scale'; } if (!$timeline) { $errors[] = 'Please select a timeline'; } if (!$name || strlen($name) < 2) { $errors[] = 'Please enter a valid name'; } if (!$email) { $errors[] = 'Please enter a valid email address'; } if (!$requirements) { $errors[] = 'Please provide detailed project requirements'; } if (!empty($errors)) { sendResponse(false, implode('. ', $errors)); } // Sanitize services array $services = array_map(function($service) { return htmlspecialchars(trim($service), ENT_QUOTES, 'UTF-8'); }, $services); // Update rate limit counter $ip = $_SERVER['REMOTE_ADDR']; $key = 'quote_' . md5($ip); $_SESSION[$key]['count']++; // Create friendly service names $service_names = [ 'web-scraping' => 'Web Scraping & Data Extraction', 'business-intelligence' => 'Business Intelligence & Analytics', 'data-processing' => 'Data Processing & Cleaning', 'automation' => 'Automation & APIs', 'consulting' => 'Custom Development', 'other' => 'Other Services' ]; $selected_services = array_map(function($service) use ($service_names) { return $service_names[$service] ?? $service; }, $services); // Create friendly scale names $scale_names = [ 'small' => 'Small Project (One-time extraction, < 10k records)', 'medium' => 'Medium Project (Regular updates, 10k-100k records)', 'large' => 'Large Project (Ongoing service, 100k+ records)', 'enterprise' => 'Enterprise (Complex multi-source solution)' ]; $friendly_scale = $scale_names[$project_scale] ?? $project_scale; // Create friendly timeline names $timeline_names = [ 'asap' => 'ASAP (Rush job)', '1-week' => 'Within 1 week', '2-4-weeks' => '2-4 weeks', 'flexible' => 'Flexible timeline' ]; $friendly_timeline = $timeline_names[$timeline] ?? $timeline; // Prepare email content $to = 'info@ukdataservices.co.uk'; $subject = 'New Quote Request - UK Data Services'; // Create detailed HTML email $emailHTML = ' New Quote Request

🚀 New Quote Request

UK Data Services

Received: ' . date('Y-m-d H:i:s') . ' UTC

👤 Contact Information
Name:
' . htmlspecialchars($name) . '
Email:
' . htmlspecialchars($email) . '
Company:
' . htmlspecialchars($company ?: 'Not provided') . '
Phone:
' . htmlspecialchars($phone ?: 'Not provided') . '
🎯 Services Required
    '; foreach ($selected_services as $service) { $emailHTML .= '
  • ✓ ' . htmlspecialchars($service) . '
  • '; } $emailHTML .= '
📊 Project Details
Project Scale:
' . htmlspecialchars($friendly_scale) . '
Timeline:
' . htmlspecialchars($friendly_timeline) . '
Budget Range:
' . htmlspecialchars($budget ?: 'Not specified') . '
🌐 Data Sources
' . nl2br(htmlspecialchars($data_sources ?: 'Not specified')) . '
📝 Detailed Requirements
' . nl2br(htmlspecialchars($requirements)) . '
🔍 Submission Details
IP Address:
' . htmlspecialchars($_SERVER['REMOTE_ADDR']) . '
User Agent:
' . htmlspecialchars($_SERVER['HTTP_USER_AGENT']) . '
Referrer:
' . htmlspecialchars($_SERVER['HTTP_REFERER'] ?? 'Direct') . '
'; // Email headers $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; $headers .= "From: \"UK Data Services Quote System\" \r\n"; $headers .= "Reply-To: " . $email . "\r\n"; $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n"; $headers .= "X-Priority: " . ($timeline === 'asap' ? '1' : '3') . "\r\n"; // Create logs directory if it doesn't exist if (!file_exists('logs')) { mkdir('logs', 0755, true); } // Send email try { $emailSent = mail($to, $subject, $emailHTML, $headers); if ($emailSent) { // Log successful submission $logEntry = date('Y-m-d H:i:s') . " - Quote request from " . $email . " (" . $_SERVER['REMOTE_ADDR'] . ") - Services: " . implode(', ', $services) . "\n"; file_put_contents('logs/quote-requests.log', $logEntry, FILE_APPEND | LOCK_EX); // Send detailed auto-reply to user $autoReplySubject = 'Your Quote Request - UK Data Services'; $autoReplyHTML = ' Quote Request Received

✅ Quote Request Received!

UK Data Services

Dear ' . htmlspecialchars($name) . ',

Thank you for your detailed quote request! We have received your inquiry for ' . implode(', ', $selected_services) . ' and our team is already reviewing your requirements.

📋 Your Request Summary:

Project Scale: ' . htmlspecialchars($friendly_scale) . '

Timeline: ' . htmlspecialchars($friendly_timeline) . '

Services: ' . implode(', ', $selected_services) . '

⏱️ What Happens Next?

Our data specialists will analyze your requirements and prepare a comprehensive proposal within 24 hours.

📝 Our Process:

1
Requirements Analysis
Our team reviews your project details and data sources
2
Technical Assessment
We evaluate the complexity and create a project plan
3
Detailed Proposal
You receive a comprehensive quote with timeline and deliverables
4
Consultation Call
We schedule a call to discuss your project and answer questions

In the meantime, if you have any urgent questions or need to discuss your project immediately, please don\'t hesitate to contact us:

  • 📞 Phone: +44 1692 689150
  • 📧 Email: info@ukdataservices.co.uk
  • 💬 Response Time: Within 24 hours

🎯 Why Choose UK Data Services?

✓ 99.9% Data Accuracy Guarantee
✓ GDPR Compliant & Secure
✓ 24/7 Support & Monitoring
✓ Scalable Solutions
✓ Experienced Team

We\'re excited to help transform your business with professional data solutions!

Best regards,
The UK Data Services Team

'; $autoReplyHeaders = "MIME-Version: 1.0\r\n"; $autoReplyHeaders .= "Content-Type: text/html; charset=UTF-8\r\n"; $autoReplyHeaders .= "From: \"UK Data Services\" \r\n"; $autoReplyHeaders .= "X-Mailer: PHP/" . phpversion() . "\r\n"; mail($email, $autoReplySubject, $autoReplyHTML, $autoReplyHeaders); sendResponse(true, 'Thank you for your quote request! We will send you a detailed proposal within 24 hours.'); } else { // Log failed email $logEntry = date('Y-m-d H:i:s') . " - FAILED quote request from " . $email . " (" . $_SERVER['REMOTE_ADDR'] . ")\n"; file_put_contents('logs/quote-errors.log', $logEntry, FILE_APPEND | LOCK_EX); sendResponse(false, 'There was an error sending your quote request. Please try again or contact us directly.'); } } catch (Exception $e) { // Log exception $logEntry = date('Y-m-d H:i:s') . " - EXCEPTION: " . $e->getMessage() . " from " . $email . " (" . $_SERVER['REMOTE_ADDR'] . ")\n"; file_put_contents('logs/quote-errors.log', $logEntry, FILE_APPEND | LOCK_EX); sendResponse(false, 'There was an error processing your quote request. Please try again later.'); } ?>