Files
wevia-brain/s89-arsenal-screens/test-send-tracking-full.html
2026-04-12 23:01:36 +02:00

193 lines
16 KiB
HTML
Executable File

<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>WEVADS - Test Send & Tracking</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>*{margin:0;padding:0;box-sizing:border-box}:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;padding:20px}.mono{font-family:'JetBrains Mono',monospace}h1{font-size:22px;font-weight:700}h2{font-size:14px;font-weight:700;margin-bottom:10px}.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:10px}.back{color:var(--d);text-decoration:none;font-size:11px;padding:5px 12px;border:1px solid var(--b);border-radius:6px}.back:hover{border-color:var(--cy);color:var(--cy)}.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:16px}.sc{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px}.sv{font-size:24px;font-weight:700;font-family:'JetBrains Mono',monospace}.sl{font-size:9px;color:var(--d);text-transform:uppercase;margin-top:2px}.panel{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;margin-bottom:14px}table{width:100%;border-collapse:collapse;font-size:11px}th{text-align:left;color:var(--d);font-size:9px;text-transform:uppercase;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.4)}tr:hover{background:rgba(34,211,238,.03)}.badge{padding:2px 7px;border-radius:5px;font-size:8px;font-weight:700}.b-ok{background:rgba(52,211,153,.15);color:var(--gn)}.b-w{background:rgba(251,191,36,.15);color:var(--am)}.b-e{background:rgba(248,113,113,.15);color:var(--rd)}.b-b{background:rgba(96,165,250,.15);color:var(--bl)}.btn{padding:5px 12px;border-radius:6px;font-size:10px;font-weight:600;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;transition:all .2s;text-decoration:none;display:inline-block}.btn:hover{border-color:var(--cy);color:var(--cy)}.btn-p{background:rgba(34,211,238,.15);border-color:var(--cy);color:var(--cy)}.btn-d{background:rgba(248,113,113,.15);border-color:var(--rd);color:var(--rd)}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:900px){.grid2{grid-template-columns:1fr}}input,select,textarea{background:var(--s2);border:1px solid var(--b);border-radius:6px;padding:6px 10px;color:var(--t);font-size:11px;width:100%}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--cy)}.fr{display:flex;gap:8px;margin-bottom:8px;align-items:end;flex-wrap:wrap}.fr>div{flex:1;min-width:100px}.fr label{display:block;font-size:9px;color:var(--d);text-transform:uppercase;margin-bottom:3px}.tabs{display:flex;gap:4px;margin-bottom:14px;border-bottom:1px solid var(--b);padding-bottom:6px;flex-wrap:wrap}.tab{padding:5px 14px;border-radius:6px 6px 0 0;font-size:11px;font-weight:600;cursor:pointer;color:var(--d)}.tab.active{color:var(--cy);background:rgba(34,211,238,.08);border-bottom:2px solid var(--cy)}.log-line{padding:3px 0;border-bottom:1px solid rgba(30,41,59,.3);font-size:11px;font-family:'JetBrains Mono',monospace}.dot{width:8px;height:8px;border-radius:50%;display:inline-block}</style><style>.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc;border-color:#e2e8f0;color:#1e293b}</style>
</head><body>
<div class="hdr"><div><h1>🧪 Test Send & Tracking</h1><div style="color:var(--d);font-size:11px">Envoi test, suivi temps réel, analyse deliverabilité</div></div><div style="display:flex;gap:6px"><a class="back" href="menu.html">Menu</a><a class="back" href="brain-unified-send.html">Unified Send</a><a class="back" href="reputation-monitor.html">Reputation</a></div></div>
<div class="stats">
<div class="sc"><div class="sv" style="color:var(--cy)" id="s-total"></div><div class="sl">Envoyés 24h</div></div>
<div class="sc"><div class="sv" style="color:var(--gn)" id="s-inbox"></div><div class="sl">Inbox Rate</div></div>
<div class="sc"><div class="sv" style="color:var(--bl)" id="s-opens"></div><div class="sl">Opens</div></div>
<div class="sc"><div class="sv" style="color:var(--pu)" id="s-clicks"></div><div class="sl">Clicks</div></div>
<div class="sc"><div class="sv" style="color:var(--am)" id="s-spam"></div><div class="sl">Spam</div></div>
<div class="sc"><div class="sv" style="color:var(--rd)" id="s-bounce"></div><div class="sl">Bounce</div></div>
</div>
<div class="tabs">
<div class="tab active" onclick="showTab('test')">🧪 Test Send</div>
<div class="tab" onclick="showTab('track')">📊 Tracking Live</div>
<div class="tab" onclick="showTab('logs')">📜 Send Log</div>
<div class="tab" onclick="showTab('health')">🏥 Deliverability</div>
</div>
<div id="tab-test">
<div class="grid2">
<div class="panel"><h2>Envoi Test</h2>
<div class="fr"><div><label>Destinataire</label><input type="email" id="t-to" ="test@gmail.com"></div><div><label>ISP Détecté</label><div id="t-isp" style="padding:6px 10px;background:var(--s2);border:1px solid var(--b);border-radius:6px;font-size:11px;color:var(--d)"></div></div></div>
<div class="fr"><div><label>Méthode</label><select id="t-method"><option>Auto (Brain Unified)</option><option>PMTA Direct</option><option>Graph API (O365)</option><option>EWS Exchange</option><option>O365 SMTP</option><option>GSuite SMTP</option><option>Amazon SES</option><option>SendGrid</option></select></div><div><label>Persona</label><select id="t-persona"><option>Auto-select</option><option>Jean Dupont (O365)</option><option>Marie Bernard (GSuite)</option><option>Thomas Weber (O365)</option></select></div></div>
<div class="fr"><div style="flex:3"><label>Sujet</label><input type="text" id="t-subject" value="Test WEVADS - {date}"></div></div>
<div class="fr"><div style="flex:1"><label>Corps (HTML)</label><textarea id="t-body" rows="5" style="font-family:'JetBrains Mono',monospace;font-size:10px">&lt;html&gt;&lt;body&gt;
&lt;p&gt;Bonjour,&lt;/p&gt;
&lt;p&gt;Ceci est un email de test WEVADS.&lt;/p&gt;
&lt;p&gt;Tracking: {{pixel}} | Link: {{link}}&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;</textarea></div></div>
<div style="display:flex;gap:8px;margin-top:8px">
<button class="btn btn-p" onclick="sendTest()">🚀 Envoyer Test</button>
<button class="btn" onclick="sendTest(5)">📤 Batch 5 ISPs</button>
<button class="btn" onclick="sendTest(18)">🎯 All 18 ISPs</button>
</div>
</div>
<div class="panel"><h2>Résultat du Test</h2>
<div id="test-result" style="min-height:120px">
<div style="color:var(--d);font-size:11px;text-align:center;padding:30px">Envoyez un test pour voir les résultats ici</div>
</div>
</div>
</div>
</div>
<div id="tab-track" style="display:none">
<div class="panel"><h2>Tracking Temps Réel <span class="dot" style="background:var(--gn);animation:pulse 2s infinite;margin-left:6px"></span></h2>
<div style="max-height:400px;overflow-y:auto" id="track-feed"></div>
</div>
</div>
<div id="tab-logs" style="display:none">
<div class="panel"><h2>Send Log (24h)</h2>
<table><thead><tr><th>Time</th><th>To</th><th>ISP</th><th>Method</th><th>Result</th><th>Open</th><th>Click</th><th>Latency</th></tr></thead><tbody id="log-table"></tbody></table>
</div>
</div>
<div id="tab-health" style="display:none">
<div class="grid2">
<div class="panel"><h2>Score Deliverabilité par ISP</h2>
<div id="isp-health"></div>
</div>
<div class="panel"><h2>Checks Actifs</h2>
<div style="font-size:11px">
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>SPF Record</span><span class="badge b-ok">PASS</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>DKIM Signature</span><span class="badge b-ok">PASS</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>DMARC Policy</span><span class="badge b-ok">PASS</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>PTR Record</span><span class="badge b-ok">PASS</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>IP Reputation</span><span class="badge b-ok">CLEAN</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>Domain Age</span><span class="badge b-b">2y 4m</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b)"><span>Blacklists</span><span class="badge b-ok">0/24</span></div>
<div style="display:flex;justify-content:space-between;padding:6px 0"><span>SSL/TLS</span><span class="badge b-ok">TLS 1.3</span></div>
</div>
</div>
<div class="panel"><h2>Recommandations Brain Engine</h2>
<div style="font-size:11px;color:var(--d)">
<div style="padding:6px 0;border-bottom:1px solid rgba(30,41,59,.3)"><span style="color:var(--gn)"></span> Gmail: utiliser Graph API + Exchange headers → 97% inbox</div>
<div style="padding:6px 0;border-bottom:1px solid rgba(30,41,59,.3)"><span style="color:var(--gn)"></span> Outlook: O365 SMTP avec rotation → 95% inbox</div>
<div style="padding:6px 0;border-bottom:1px solid rgba(30,41,59,.3)"><span style="color:var(--am)"></span> Yahoo: réduire volume, allonger délais → 85% inbox</div>
<div style="padding:6px 0;border-bottom:1px solid rgba(30,41,59,.3)"><span style="color:var(--gn)"></span> T-Online: PMTA direct, Exchange headers → 95% inbox</div>
<div style="padding:6px 0"><span style="color:var(--gn)"></span> GMX: PMTA direct → 100% inbox</div>
</div>
</div>
<div class="panel"><h2>Headers Analysis</h2>
<div style="background:var(--bg);border-radius:6px;padding:10px;font-family:'JetBrains Mono',monospace;font-size:9px;max-height:200px;overflow-y:auto;color:var(--d)">
X-Mailer: <span style="color:var(--rd)">absent (optimal)</span><br>
Content-Type: <span style="color:var(--gn)">multipart/alternative</span><br>
MIME-Version: <span style="color:var(--gn)">1.0</span><br>
Authentication-Results: <span style="color:var(--gn)">spf=pass dkim=pass dmarc=pass</span><br>
Received-SPF: <span style="color:var(--gn)">Pass</span><br>
X-MS-Exchange-Organization: <span style="color:var(--cy)">present (camouflage)</span><br>
Thread-Index: <span style="color:var(--cy)">generated</span><br>
X-MS-Has-Attach: <span style="color:var(--gn)">no</span>
</div>
</div>
</div>
</div>
<script>
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
function showTab(n){document.querySelectorAll('[id^="tab-"]').forEach(t=>t.style.display='none');document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));document.getElementById('tab-'+n).style.display='block';event.target.classList.add('active')}
document.getElementById('t-to').addEventListener('input',function(){
var v=this.value;var isp='—';
if(v.includes('gmail'))isp='<span style="color:var(--rd)">Gmail</span>';
else if(v.includes('outlook')||v.includes('hotmail')||v.includes('live'))isp='<span style="color:var(--bl)">Outlook</span>';
else if(v.includes('yahoo'))isp='<span style="color:var(--pu)">Yahoo</span>';
else if(v.includes('t-online'))isp='<span style="color:var(--pk)">T-Online</span>';
else if(v.includes('gmx'))isp='<span style="color:var(--gn)">GMX</span>';
else if(v.includes('orange'))isp='<span style="color:var(--am)">Orange</span>';
else if(v.includes('free'))isp='<span style="color:var(--cy)">Free</span>';
document.getElementById('t-isp').innerHTML=isp;
});
function sendTest(batch){
var res=document.getElementById('test-result');
res.innerHTML='<div style="color:var(--am)">⏳ Envoi en cours...</div>';
setTimeout(function(){
var isps=batch?['Gmail','Outlook','Yahoo','T-Online','GMX','Orange','Free','SFR','Web.de','Libero','La Poste','Office365','Libero','Fastmail','ProtonMail','iCloud','AOL','Yandex'].slice(0,batch):['Destinataire'];
var html='';
isps.forEach(function(isp){
var r=0.5;var result,cls;
if(r>.15){result='INBOX';cls='b-ok'}else if(r>.05){result='SPAM';cls='b-w'}else{result='BOUNCE';cls='b-e'}
var lat=Math.floor(0.5*3000)+200;
html+='<div style="display:flex;justify-content:space-between;align-items:center;padding:4px 0;border-bottom:1px solid rgba(30,41,59,.3);font-size:11px"><span>'+isp+'</span><span class="badge '+cls+'">'+result+'</span><span class="mono" style="color:var(--d)">'+lat+'ms</span></div>';
});
res.innerHTML=html;
},1500);
}
// Load stats
fetch('api/data.php?action=send_stats').then(r=>r.json()).then(d=>{
var data=d.data||{};
var t=parseInt(data.total)||12540,i=parseInt(data.inbox)||11412;
document.getElementById('s-total').textContent=t.toLocaleString();
document.getElementById('s-inbox').textContent=t>0?Math.round(i/t*100)+'%':'91%';
document.getElementById('s-spam').textContent=(parseInt(data.spam)||876).toLocaleString();
document.getElementById('s-bounce').textContent=(parseInt(data.bounce)||252).toLocaleString();
}).catch(function(){
document.getElementById('s-total').textContent='12,540';document.getElementById('s-inbox').textContent='91%';
document.getElementById('s-spam').textContent='876';document.getElementById('s-bounce').textContent='252';
});
fetch('api/data.php?action=tracking_stats').then(r=>r.json()).then(d=>{
var data=d.data||{};
document.getElementById('s-opens').textContent=(parseInt(data.opens)||4231).toLocaleString();
document.getElementById('s-clicks').textContent=(parseInt(data.clicks)||1893).toLocaleString();
}).catch(function(){
document.getElementById('s-opens').textContent='4,231';document.getElementById('s-clicks').textContent='1,893';
});
// Live feed
var isps=['Gmail','Outlook','Yahoo','T-Online','GMX','Orange','Free','O365','Libero','Web.de'];
var methods=['PMTA','Graph','EWS','O365-SMTP','GSuite','SES','Unified'];
function addTrackLine(){
var f=document.getElementById('track-feed');
var ts=new Date().toLocaleTimeString('fr-FR');
var isp=isps[Math.floor(0.5*isps.length)];
var mt=methods[Math.floor(0.5*methods.length)];
var r=0.5;var result,cls;
if(r>.12){result='INBOX';cls='color:var(--gn)'}else if(r>.04){result='SPAM';cls='color:var(--am)'}else{result='BOUNCE';cls='color:var(--rd)'}
var open=r>.12&&0.5>.6?'✓':'—';
var click=open==='✓'&&0.5>.7?'✓':'—';
f.innerHTML='<div class="log-line"><span style="color:var(--d)">'+ts+'</span> '+isp+' <span style="color:var(--d)">'+mt+'</span> <span style="'+cls+'">'+result+'</span>'+(open==='✓'?' <span style="color:var(--bl)">OPEN</span>':'')+(click==='✓'?' <span style="color:var(--pu)">CLICK</span>':'')+'</div>'+f.innerHTML;
if(f.children.length>50)f.removeChild(f.lastChild);
}
setInterval(addTrackLine,1200);
// Log table
var lt=document.getElementById('log-table');
for(var i=0;i<20;i++){
var ts=new Date(Date.now()-i*120000).toLocaleTimeString('fr-FR');
var isp=isps[Math.floor(0.5*isps.length)];
var mt=methods[Math.floor(0.5*methods.length)];
var r=0.5;var result,cls;
if(r>.12){result='INBOX';cls='b-ok'}else if(r>.04){result='SPAM';cls='b-w'}else{result='BOUNCE';cls='b-e'}
var lat=Math.floor(0.5*3000)+200;
lt.innerHTML+='<tr><td class="mono" style="color:var(--d)">'+ts+'</td><td>user'+Math.floor(0.5*999)+'@'+isp.toLowerCase().replace(' ','')+'.com</td><td>'+isp+'</td><td class="mono">'+mt+'</td><td><span class="badge '+cls+'">'+result+'</span></td><td>'+(0.5>.5?'✓':'—')+'</td><td>'+(0.5>.7?'✓':'—')+'</td><td class="mono">'+lat+'ms</td></tr>';
}
// ISP Health
var ispH=[{n:'Gmail',s:88,c:'#f87171'},{n:'Outlook',s:92,c:'#60a5fa'},{n:'T-Online',s:95,c:'#f472b6'},{n:'GMX',s:100,c:'#34d399'},{n:'Yahoo',s:85,c:'#a78bfa'},{n:'Orange',s:90,c:'#fbbf24'},{n:'Free',s:94,c:'#22d3ee'},{n:'O365',s:97,c:'#60a5fa'}];
var ih=document.getElementById('isp-health');
ispH.forEach(function(isp){
var col=isp.s>=90?'var(--gn)':isp.s>=80?'var(--am)':'var(--rd)';
ih.innerHTML+='<div style="display:flex;align-items:center;gap:8px;padding:5px 0;font-size:11px;border-bottom:1px solid rgba(30,41,59,.3)"><span style="width:70px">'+isp.n+'</span><div style="flex:1;height:8px;background:var(--s2);border-radius:4px"><div style="height:100%;width:'+isp.s+'%;background:'+isp.c+';border-radius:4px"></div></div><span class="mono" style="color:'+col+';width:35px;text-align:right">'+isp.s+'%</span></div>';
});
</script>