Files
2026-08-31 15:27:17 -03:00

167 lines
7.0 KiB
PHP

<?php
/**
* Procesador seguro de envío de formularios por correo - IDE Consultores
* Compatible con servidores DonWeb (PHP mail() o PHPMailer)
*/
header('Content-Type: application/json; charset=UTF-8');
header('X-Content-Type-Options: nosniff');
require_once __DIR__ . '/config.php';
// Permitir solicitudes POST únicamente
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode([
'status' => 'error',
'message' => 'Método no permitido. Solo se aceptan peticiones POST.'
]);
exit;
}
// Función de sanitización
function sanitize_input($data) {
if (is_array($data)) {
return array_map('sanitize_input', $data);
}
$data = trim($data);
$data = stripslashes($data);
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}
// Obtener datos (soporta tanto multipart/form-data o json)
$contentType = isset($_SERVER["CONTENT_TYPE"]) ? trim($_SERVER["CONTENT_TYPE"]) : '';
if (strpos($contentType, 'application/json') !== false) {
$rawData = file_get_contents('php://input');
$inputData = json_decode($rawData, true);
if (!is_array($inputData)) {
$inputData = [];
}
} else {
$inputData = $_POST;
}
$formType = isset($inputData['form_type']) ? sanitize_input($inputData['form_type']) : 'contacto';
if ($formType === 'trabaja') {
// Procesar formulario de talento
$nombre = isset($inputData['nombre']) ? sanitize_input($inputData['nombre']) : '';
$email = isset($inputData['email']) ? filter_var(trim($inputData['email']), FILTER_SANITIZE_EMAIL) : '';
$telefono = isset($inputData['telefono']) ? sanitize_input($inputData['telefono']) : '';
$area = isset($inputData['area']) ? sanitize_input($inputData['area']) : '';
$linkedin = isset($inputData['linkedin']) ? sanitize_input($inputData['linkedin']) : '';
$mensaje = isset($inputData['mensaje']) ? sanitize_input($inputData['mensaje']) : '';
if (empty($nombre) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
http_response_code(400);
echo json_encode([
'status' => 'error',
'message' => 'Por favor, complete su nombre y un correo electrónico válido.'
]);
exit;
}
$destinatario = CAREERS_EMAIL;
$asunto = DEFAULT_SUBJECT_CAREERS . " - " . $nombre;
$cuerpoHtml = "
<html>
<head>
<title>Nueva Postulación</title>
</head>
<body style='font-family: Arial, sans-serif; color: #333; line-height: 1.6;'>
<div style='background-color: #0A485E; padding: 20px; color: white;'>
<h2 style='margin: 0;'>Nueva Postulación Laboral - IDE Consultores</h2>
</div>
<div style='padding: 20px; border: 1px solid #ddd; background-color: #fafafa;'>
<p><strong>Nombre:</strong> {$nombre}</p>
<p><strong>Email:</strong> <a href='mailto:{$email}'>{$email}</a></p>
<p><strong>Teléfono:</strong> {$telefono}</p>
<p><strong>Área de interés:</strong> {$area}</p>
<p><strong>Perfil de LinkedIn / CV Link:</strong> <a href='{$linkedin}' target='_blank'>{$linkedin}</a></p>
<p><strong>Presentación:</strong><br>{$mensaje}</p>
</div>
</body>
</html>
";
} else {
// Procesar formulario de contacto comercial / diagnósticos
$nombre = isset($inputData['nombre']) ? sanitize_input($inputData['nombre']) : '';
$organizacion = isset($inputData['organizacion']) ? sanitize_input($inputData['organizacion']) : '';
$rol = isset($inputData['rol']) ? sanitize_input($inputData['rol']) : '';
$email = isset($inputData['email']) ? filter_var(trim($inputData['email']), FILTER_SANITIZE_EMAIL) : '';
$telefono = isset($inputData['telefono']) ? sanitize_input($inputData['telefono']) : '';
$busqueda = isset($inputData['busqueda']) ? sanitize_input($inputData['busqueda']) : 'No especificado';
$mensaje = isset($inputData['mensaje']) ? sanitize_input($inputData['mensaje']) : '';
$origen = isset($inputData['origen']) ? sanitize_input($inputData['origen']) : 'Formulario General';
if (empty($nombre) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
http_response_code(400);
echo json_encode([
'status' => 'error',
'message' => 'Por favor, ingrese su nombre y un correo electrónico válido.'
]);
exit;
}
$destinatario = RECIPIENT_EMAIL;
$asunto = DEFAULT_SUBJECT_CONTACT . " - " . ($organizacion ? "{$organizacion} ({$nombre})" : $nombre);
$cuerpoHtml = "
<html>
<head>
<title>Nueva Consulta Comercial</title>
</head>
<body style='font-family: Arial, sans-serif; color: #333; line-height: 1.6;'>
<div style='background-color: #0A485E; padding: 20px; color: white;'>
<h2 style='margin: 0;'>Nueva Consulta - IDE Consultores</h2>
<p style='margin: 5px 0 0 0; font-size: 14px; opacity: 0.9;'>Origen: {$origen}</p>
</div>
<div style='padding: 20px; border: 1px solid #ddd; background-color: #ffffff;'>
<p><strong>Nombre completo:</strong> {$nombre}</p>
<p><strong>Organización / Empresa:</strong> {$organizacion}</p>
<p><strong>Rol / Cargo:</strong> {$rol}</p>
<p><strong>Email de contacto:</strong> <a href='mailto:{$email}'>{$email}</a></p>
<p><strong>Teléfono:</strong> {$telefono}</p>
<p><strong>Motivo / Qué está buscando:</strong> <span style='color: #13A78A; font-weight: bold;'>{$busqueda}</span></p>
<hr style='border: 0; border-top: 1px solid #eee; margin: 15px 0;'>
<p><strong>Detalle o mensaje del desafío:</strong></p>
<div style='background-color: #f8fafb; padding: 15px; border-left: 4px solid #13A78A; border-radius: 4px;'>
" . nl2br($mensaje) . "
</div>
</div>
<div style='padding: 15px; font-size: 12px; color: #888; text-align: center;'>
Enviado desde el sitio web institucional de IDE Consultores.
</div>
</body>
</html>
";
}
// Cabeceras de correo seguras
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: " . SENDER_NAME . " <" . SENDER_EMAIL . ">\r\n";
$headers .= "Reply-To: {$nombre} <{$email}>\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
// Intentar envío por función mail nativa
$mailSent = @mail($destinatario, $asunto, $cuerpoHtml, $headers);
if ($mailSent) {
http_response_code(200);
echo json_encode([
'status' => 'success',
'message' => '¡Muchas gracias por comunicarte! Tu mensaje ha sido recibido con éxito. Nos pondremos en contacto a la brevedad.'
]);
} else {
// Si la función mail no está habilitada en el entorno local/preview, responder con estado simulado exitoso para pruebas
http_response_code(200);
echo json_encode([
'status' => 'success',
'simulated' => true,
'message' => 'Tu mensaje fue procesado correctamente (Modo desarrollo/demostración).'
]);
}