149 lines
6.9 KiB
PHP
Executable File
149 lines
6.9 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* BRAIN-AWARE SEND WRAPPER
|
|
* Wraps unified send with Brain Config placeholder resolution
|
|
* Endpoint: /api/brain-smart-send.php?action=send|test|preview
|
|
*/
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
define('DB_HOST','127.0.0.1');
|
|
define('DB_NAME','adx_system');
|
|
define('DB_USER','postgres');
|
|
define('DB_PASS','');
|
|
define('TRACKING_DOMAIN','culturellemejean.charity');
|
|
|
|
$ISP_MAP = [
|
|
'gmx.de'=>'GMX','gmx.net'=>'GMX','gmx.com'=>'GMX','web.de'=>'WEB.DE','freenet.de'=>'FREENET',
|
|
't-online.de'=>'T-ONLINE','magenta.de'=>'T-ONLINE','orange.fr'=>'ORANGE','wanadoo.fr'=>'ORANGE',
|
|
'laposte.net'=>'LAPOSTE','sfr.fr'=>'SFR','free.fr'=>'FREE','aliceadsl.fr'=>'ALICE',
|
|
'gmail.com'=>'GMAIL','googlemail.com'=>'GMAIL','outlook.com'=>'OUTLOOK','hotmail.com'=>'OUTLOOK',
|
|
'hotmail.fr'=>'OUTLOOK','live.com'=>'OUTLOOK','live.fr'=>'OUTLOOK','msn.com'=>'OUTLOOK',
|
|
'yahoo.com'=>'YAHOO','yahoo.fr'=>'YAHOO','ymail.com'=>'YAHOO','aol.com'=>'AOL',
|
|
'ziggo.nl'=>'ZIGGO','kpnmail.nl'=>'KPN','libero.it'=>'LIBERO','btinternet.com'=>'BT',
|
|
'icloud.com'=>'ICLOUD','protonmail.com'=>'PROTON','proton.me'=>'PROTON','bluewin.ch'=>'BLUEWIN',
|
|
];
|
|
|
|
$db = new PDO("pgsql:host=".DB_HOST.";dbname=".DB_NAME,DB_USER,DB_PASS);
|
|
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true) ?: array_merge($_POST, $_GET);
|
|
$action = $input['action'] ?? 'preview';
|
|
|
|
function resolvePlaceholders($text, $to, $domain) {
|
|
$eb64 = base64_encode($to);
|
|
$fn = ucfirst(explode('@', $to)[0]);
|
|
$map = [
|
|
'[email]'=>$to, '[email_b64]'=>$eb64, '[domain]'=>$domain, '[rdns]'=>$domain,
|
|
'[fname]'=>$fn, '[lname]'=>'', '[Name]'=>$fn, '[first_name]'=>$fn, '[last_name]'=>'',
|
|
'[company]'=>'WEVADS', '[mail_date]'=>date('r'), '[date]'=>date('d/m/Y'), '[time]'=>date('H:i'),
|
|
'[a_7]'=>substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,7),
|
|
'[n_5]'=>str_pad(rand(0,99999),5,'0',STR_PAD_LEFT),
|
|
'[n_3]'=>str_pad(rand(0,999),3,'0',STR_PAD_LEFT),
|
|
'[a_3]'=>substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,3),
|
|
];
|
|
return str_replace(array_keys($map), array_values($map), $text);
|
|
}
|
|
|
|
function getBrainConfig($db, $isp) {
|
|
$st = $db->prepare("SELECT * FROM admin.brain_configs WHERE isp_target=:i AND is_active=TRUE AND is_winner=TRUE ORDER BY inbox_rate DESC LIMIT 1");
|
|
$st->execute([':i'=>$isp]);
|
|
return $st->fetch(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
function detectISP($email) {
|
|
global $ISP_MAP;
|
|
$d = strtolower(substr($email, strrpos($email, '@')+1));
|
|
return $ISP_MAP[$d] ?? 'UNKNOWN';
|
|
}
|
|
|
|
function buildFullHeaders($cfg, $to, $domain) {
|
|
$h = "MIME-Version: 1.0\r\n";
|
|
$h .= "Message-Id: <" . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,7) . str_pad(rand(0,99999),5,'0',STR_PAD_LEFT) . str_pad(rand(0,999),3,'0',STR_PAD_LEFT) . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,3) . base64_encode($to) . "@" . $domain . ">\r\n";
|
|
$h .= "From: " . ($cfg['from_name'] ?: '"Service"') . " <" . ($cfg['from_email'] ?: "info@$domain") . ">\r\n";
|
|
$h .= "Subject: " . ($cfg['subject_template'] ?: 'Notification') . "\r\n";
|
|
$h .= "To: $to\r\n";
|
|
$enc = $cfg['encoding'] ?: 'quoted-printable';
|
|
$h .= "Content-Transfer-Encoding: $enc\r\n";
|
|
$ct = $cfg['content_type'] ?: 'multipart/alternative';
|
|
$charset = $cfg['charset'] ?: 'utf-8';
|
|
if (strpos($ct,'charset')===false && strpos($ct,'multipart')===false) $ct .= "; charset=$charset";
|
|
$h .= "Content-Type: $ct\r\n";
|
|
$h .= "Date: " . date('r') . "\r\n";
|
|
for ($i=1;$i<=5;$i++) {
|
|
$n=$cfg["header_{$i}_name"]??''; $v=$cfg["header_{$i}_value"]??'';
|
|
if ($n && $v) $h .= "$n: $v\r\n";
|
|
}
|
|
return resolvePlaceholders($h, $to, $domain);
|
|
}
|
|
|
|
switch($action) {
|
|
case 'preview':
|
|
$to = $input['to'] ?? 'test@gmail.com';
|
|
$isp = detectISP($to);
|
|
$cfg = getBrainConfig($db, $isp);
|
|
if (!$cfg) { echo json_encode(['error'=>"No brain config for ISP: $isp"]); break; }
|
|
$headers = buildFullHeaders($cfg, $to, TRACKING_DOMAIN);
|
|
$body = resolvePlaceholders($cfg['body_template'] ?? '<p>No body</p>', $to, TRACKING_DOMAIN);
|
|
echo json_encode([
|
|
'isp'=>$isp, 'config_id'=>$cfg['id'], 'inbox_rate'=>$cfg['inbox_rate'],
|
|
'headers'=>$headers, 'body'=>$body, 'send_method'=>$cfg['send_method'],
|
|
'placeholders_resolved'=>true
|
|
]);
|
|
break;
|
|
|
|
case 'send':
|
|
$to = $input['to'] ?? '';
|
|
if (!$to) { echo json_encode(['error'=>'Missing to']); break; }
|
|
$isp = detectISP($to);
|
|
$cfg = getBrainConfig($db, $isp);
|
|
|
|
// Build resolved parameters
|
|
$dom = TRACKING_DOMAIN;
|
|
$from = $cfg ? (($cfg['from_name'] ?: '"Service"') . ' <' . ($cfg['from_email'] ?: "info@$dom") . '>') : "send@$dom";
|
|
$subj = $cfg['subject_template'] ?? ($input['subject'] ?? 'Notification');
|
|
$html = $cfg['body_template'] ?? ($input['html'] ?? '<p>Test</p>');
|
|
|
|
$from = resolvePlaceholders($from, $to, $dom);
|
|
$subj = resolvePlaceholders($subj, $to, $dom);
|
|
$html = resolvePlaceholders($html, $to, $dom);
|
|
|
|
// Delegate to unified send
|
|
$payload = json_encode(['action'=>'send','to'=>$to,'from'=>$from,'subject'=>$subj,'html'=>$html,'method'=>$input['method']??'auto']);
|
|
$ch = curl_init('http://127.0.0.1:5890/api/brain-unified-send.php');
|
|
curl_setopt_array($ch, [CURLOPT_POST=>true, CURLOPT_POSTFIELDS=>$payload, CURLOPT_RETURNTRANSFER=>true, CURLOPT_HTTPHEADER=>['Content-Type: application/json']]);
|
|
$resp = curl_exec($ch); curl_close($ch);
|
|
$result = json_decode($resp, true) ?: ['error'=>'Send failed'];
|
|
$result['brain_config_id'] = $cfg['id'] ?? null;
|
|
$result['isp'] = $isp;
|
|
$result['placeholders_resolved'] = true;
|
|
echo json_encode($result);
|
|
break;
|
|
|
|
case 'warmup_send':
|
|
// For warmup: use brain config but with warmup-safe content
|
|
$to = $input['to'] ?? '';
|
|
if (!$to) { echo json_encode(['error'=>'Missing to']); break; }
|
|
$isp = detectISP($to);
|
|
$cfg = getBrainConfig($db, $isp);
|
|
$dom = TRACKING_DOMAIN;
|
|
|
|
// Warmup uses the same headers but simpler body
|
|
$from = $cfg ? (($cfg['from_name'] ?: '"Service"') . ' <' . ($cfg['from_email'] ?: "info@$dom") . '>') : "send@$dom";
|
|
$subj = $cfg['subject_template'] ?? 'Hello';
|
|
$html = '<html><body><p>Thank you for your interest. Please visit our website for more information.</p></body></html>';
|
|
|
|
$from = resolvePlaceholders($from, $to, $dom);
|
|
$subj = resolvePlaceholders($subj, $to, $dom);
|
|
|
|
$payload = json_encode(['action'=>'send','to'=>$to,'from'=>$from,'subject'=>$subj,'html'=>$html,'method'=>$input['method']??'auto','campaign_id'=>0]);
|
|
$ch = curl_init('http://127.0.0.1:5890/api/brain-unified-send.php');
|
|
curl_setopt_array($ch, [CURLOPT_POST=>true, CURLOPT_POSTFIELDS=>$payload, CURLOPT_RETURNTRANSFER=>true, CURLOPT_HTTPHEADER=>['Content-Type: application/json']]);
|
|
$resp = curl_exec($ch); curl_close($ch);
|
|
echo $resp;
|
|
break;
|
|
|
|
default:
|
|
echo json_encode(['actions'=>['preview','send','warmup_send'],'usage'=>'?action=preview&to=test@gmail.com']);
|
|
}
|