111 lines
3.3 KiB
PHP
111 lines
3.3 KiB
PHP
<?php
|
|
// LoperBoys - Contact Form Email Handler
|
|
// Uses PHPMailer to connect directly to hMailserver on 10.10.9.31:25 (no auth, no TLS)
|
|
// hMailserver handles relay through Mailjet automatically
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// Only accept POST
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
http_response_code(405);
|
|
echo json_encode(['error' => 'Method not allowed']);
|
|
exit;
|
|
}
|
|
|
|
// Get JSON body
|
|
$input = json_decode(file_get_contents('php://input'), true) ?: $_POST;
|
|
|
|
$name = trim($input['name'] ?? '');
|
|
$phone = trim($input['phone'] ?? '');
|
|
$email = trim($input['email'] ?? '');
|
|
$service = trim($input['service'] ?? '');
|
|
$message = trim($input['message'] ?? '');
|
|
|
|
// --- Spam honeypot: if the hidden field has a value, it's a bot ---
|
|
if (!empty($input['website_url'] ?? '')) {
|
|
// Bots fill this; humans don't. Silently succeed.
|
|
echo json_encode(['success' => true]);
|
|
exit;
|
|
}
|
|
|
|
// Validate required fields
|
|
$errors = [];
|
|
if (!$name) $errors[] = 'Name is required';
|
|
if (!$phone) $errors[] = 'Phone is required';
|
|
if (!$service) $errors[] = 'Service selection is required';
|
|
|
|
if (!empty($errors)) {
|
|
http_response_code(400);
|
|
echo json_encode(['error' => implode(', ', $errors)]);
|
|
exit;
|
|
}
|
|
|
|
// Map service values to readable names
|
|
$serviceNames = [
|
|
'lawn-mowing' => 'Lawn Mowing',
|
|
'gutter-cleanout' => 'Gutter Cleanout',
|
|
'window-cleaning' => 'Window Cleaning',
|
|
'leaf-raking' => 'Leaf Raking',
|
|
'snow-shoveling' => 'Snow Shoveling',
|
|
'car-washing' => 'Car Washing',
|
|
'wood-stacking' => 'Wood Stacking',
|
|
'lawn-pickup' => 'Lawn Pick-up',
|
|
'porch-sweeping' => 'Porch Sweeping',
|
|
'other' => 'Other',
|
|
];
|
|
$serviceDisplay = $serviceNames[$service] ?? $service;
|
|
|
|
// --- Email Configuration ---
|
|
$to = 'contact@loperboys.com';
|
|
$subject = 'Quote Request: ' . $serviceDisplay . ' — ' . $name;
|
|
|
|
// Load PHPMailer
|
|
require_once __DIR__ . '/vendor/autoload.php';
|
|
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
$mail = new PHPMailer(true);
|
|
|
|
try {
|
|
// Server settings — direct SMTP to hMailserver (no auth, no TLS)
|
|
$mail->isSMTP();
|
|
$mail->Host = '10.10.9.31';
|
|
$mail->Port = 25;
|
|
$mail->SMTPAuth = false;
|
|
$mail->SMTPAutoTLS = false; // hMailserver advertises STARTTLS but we don't have a cert
|
|
|
|
// Sender and recipients
|
|
$mail->setFrom('noreply@loperboys.com', 'LoperBoys');
|
|
$mail->addAddress($to, 'LoperBoys');
|
|
|
|
// Reply-to: the customer's email address
|
|
if ($email) {
|
|
$mail->addReplyTo($email, $name);
|
|
}
|
|
|
|
// Email content
|
|
$mail->isHTML(false);
|
|
$mail->CharSet = 'UTF-8';
|
|
$mail->Subject = $subject;
|
|
$mail->Body = "New Quote Request\n" .
|
|
str_repeat('=', 40) . "\n\n" .
|
|
"Name: $name\n" .
|
|
"Phone: $phone\n" .
|
|
"Email: $email\n" .
|
|
"Service: $serviceDisplay\n\n" .
|
|
"Message:\n$message\n\n" .
|
|
str_repeat('=', 40) . "\n" .
|
|
"Sent from loperboys.com\n";
|
|
|
|
$mail->send();
|
|
echo json_encode(['success' => true]);
|
|
} catch (Exception $e) {
|
|
$error = $mail->ErrorInfo;
|
|
error_log("LoperBoys email failed: $error");
|
|
// Return failure so the JS shows the fallback (mailto) instead of fake success
|
|
http_response_code(500);
|
|
echo json_encode(['success' => false, 'error' => 'Email delivery failed. Please call us directly.']);
|
|
}
|
|
?>
|