813 lines
40 KiB
PHP
Executable File
813 lines
40 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* DELIVERABILITY HUB - Solution Intégrée Complète
|
|
* Warmup + ISP Config + Header/Body Generator + Domain Ranking
|
|
*/
|
|
$pdo = new PDO("pgsql:host=localhost;dbname=adx_system", "admin", "admin123");
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
// ============================================
|
|
// ISP DATABASE COMPLETE
|
|
// ============================================
|
|
$isp_database = [
|
|
// === WEBMAILS MAJEURS ===
|
|
'gmail' => [
|
|
'name' => 'Gmail / Google Workspace',
|
|
'category' => 'Webmail',
|
|
'domains' => 'gmail.com, googlemail.com',
|
|
'filter' => 'Google SpamBrain',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Barracuda, SpamCop',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'Engagement crucial 24h, Text version obligatoire, AMP supporté',
|
|
'max_smtp_out' => 3,
|
|
'msg_rate' => '30/h',
|
|
'headers' => "List-Unsubscribe: <mailto:unsub@[domain]>\nList-Unsubscribe-Post: List-Unsubscribe=One-Click\nFeedback-ID: [campaign]:[user]:[domain]\nPrecedence: bulk",
|
|
'body_tips' => 'Ratio 60/40 texte/image, engagement matters, éviter pixels multiples',
|
|
'domains_inbox' => '.com aged 6mo+, Google Workspace domains',
|
|
'color' => '#ea4335'
|
|
],
|
|
'hotmail' => [
|
|
'name' => 'Hotmail / Outlook / Live / MSN',
|
|
'category' => 'Webmail',
|
|
'domains' => 'hotmail.com, outlook.com, live.com, msn.com',
|
|
'filter' => 'Microsoft SmartScreen',
|
|
'strictness' => 'Très Strict',
|
|
'blacklists' => 'Spamhaus, Barracuda, Microsoft Internal',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'SNDS/JMRP monitoring, Return Path certification aide',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '15/h',
|
|
'headers' => "X-MS-Exchange-Organization-AuthSource: [domain]\nX-Mailer: Microsoft Outlook 16.0\nX-Priority: 3\nList-Unsubscribe-Post: List-Unsubscribe=One-Click",
|
|
'body_tips' => 'Ratio 80/20 texte/image, HTML clean, footer avec adresse physique',
|
|
'domains_inbox' => '.com, .net aged, éviter .xyz .top .info',
|
|
'color' => '#0078d4'
|
|
],
|
|
'yahoo' => [
|
|
'name' => 'Yahoo / AOL / Verizon',
|
|
'category' => 'Webmail',
|
|
'domains' => 'yahoo.com, yahoo.fr, aol.com, ymail.com',
|
|
'filter' => 'Cloudmark',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, SpamCop, Invaluement',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'CFL Feedback Loop OBLIGATOIRE',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "X-Priority: 3\nX-Cloudmark-Authority: [domain]\nList-Unsubscribe: <mailto:unsub@[domain]>\nPrecedence: bulk",
|
|
'body_tips' => 'Éviter patterns spam connus, variation des subjects importante',
|
|
'domains_inbox' => '.com, CSA certified, established domains',
|
|
'color' => '#6001d2'
|
|
],
|
|
'office365' => [
|
|
'name' => 'Office 365 Tenant',
|
|
'category' => 'Enterprise',
|
|
'domains' => 'onmicrosoft.com, custom domains',
|
|
'filter' => 'Exchange Online Protection',
|
|
'strictness' => 'Configurable',
|
|
'blacklists' => 'Microsoft Internal',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'Connecteur requis, 10K/jour max, Anti-spam désactivable via PowerShell',
|
|
'max_smtp_out' => 10,
|
|
'msg_rate' => '500/h',
|
|
'headers' => "X-MS-Exchange-Organization-AuthAs: Internal\nX-MS-Exchange-Organization-AuthSource: [domain]",
|
|
'body_tips' => 'Config anti-spam outbound, connector smart host',
|
|
'domains_inbox' => 'FreeDNS verified, custom domains',
|
|
'color' => '#d83b01'
|
|
],
|
|
'amazon_ses' => [
|
|
'name' => 'Amazon SES',
|
|
'category' => 'Cloud Provider',
|
|
'domains' => 'Verified domains',
|
|
'filter' => 'Amazon Internal',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, Barracuda',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'Sandbox exit requis, $0.10/1000 = meilleur ROI',
|
|
'max_smtp_out' => 10,
|
|
'msg_rate' => '100/h',
|
|
'headers' => "X-SES-CONFIGURATION-SET: [set]\nFeedback-ID: [campaign]",
|
|
'body_tips' => 'Bounce handling automatique, click tracking intégré',
|
|
'domains_inbox' => 'Tout domaine vérifié SES',
|
|
'color' => '#ff9900'
|
|
],
|
|
|
|
// === ALLEMAGNE ===
|
|
'tonline' => [
|
|
'name' => 'T-Online (Deutsche Telekom)',
|
|
'category' => 'Cable/Telco DE',
|
|
'domains' => 't-online.de, telekom.de',
|
|
'filter' => 'Eleven/Cyren',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, NiX Spam, UCEPROTECT',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'eco CSA certification très utile, contenu DE apprécié',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '15/h',
|
|
'headers' => "X-Priority: 3\nList-Unsubscribe: <[unsub]>\nContent-Language: de",
|
|
'body_tips' => 'Contenu en allemand, certificat eco CSA, IP EU préférée',
|
|
'domains_inbox' => '.de domains, eco CSA certified',
|
|
'color' => '#e20074'
|
|
],
|
|
'gmx' => [
|
|
'name' => 'GMX / Web.de / 1&1',
|
|
'category' => 'Webmail DE',
|
|
'domains' => 'gmx.de, gmx.net, web.de, 1und1.de',
|
|
'filter' => 'Cloudmark',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, NiX Spam',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'eco CSA certification recommandée',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <mailto:stop@[domain]>\nContent-Language: de",
|
|
'body_tips' => 'Style professionnel allemand, Anrede formelle',
|
|
'domains_inbox' => '.de, .com aged, eco CSA certified',
|
|
'color' => '#004a99'
|
|
],
|
|
|
|
// === PAYS-BAS ===
|
|
'ziggo' => [
|
|
'name' => 'Ziggo (VodafoneZiggo)',
|
|
'category' => 'Cable NL',
|
|
'domains' => 'ziggo.nl, casema.nl, quicknet.nl',
|
|
'filter' => 'Cloudmark CSI',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, SpamCop',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'Cloudmark CSI CRITIQUE, IP NL préférée',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <[unsub]>\nContent-Language: nl",
|
|
'body_tips' => 'Éviter domaines .xyz/.top, contenu NL apprécié',
|
|
'domains_inbox' => '.nl, .com aged, Cloudmark clean history',
|
|
'color' => '#00a870'
|
|
],
|
|
'kpn' => [
|
|
'name' => 'KPN / Planet / HetNet',
|
|
'category' => 'Telco NL',
|
|
'domains' => 'kpn.nl, planet.nl, hetnet.nl, xs4all.nl',
|
|
'filter' => 'SpamAssassin',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, SORBS',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'IP EU préférée, contenu NL apprécié',
|
|
'max_smtp_out' => 3,
|
|
'msg_rate' => '20/h',
|
|
'headers' => "X-Priority: 3\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'SpamAssassin score < 5, HTML simple',
|
|
'domains_inbox' => '.nl, .com, .eu domains',
|
|
'color' => '#00a650'
|
|
],
|
|
|
|
// === FRANCE ===
|
|
'orange' => [
|
|
'name' => 'Orange / Wanadoo',
|
|
'category' => 'Telco FR',
|
|
'domains' => 'orange.fr, wanadoo.fr',
|
|
'filter' => 'Vade Secure',
|
|
'strictness' => 'Moyen-Strict',
|
|
'blacklists' => 'Spamhaus, Signal Spam, SORBS',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'Signal Spam FBL, IP française PRÉFÉRÉE',
|
|
'max_smtp_out' => 3,
|
|
'msg_rate' => '20/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>\nContent-Language: fr",
|
|
'body_tips' => 'Inscription Signal Spam recommandée, contenu FR',
|
|
'domains_inbox' => '.fr, .com aged, Signal Spam clean',
|
|
'color' => '#ff6600'
|
|
],
|
|
'sfr' => [
|
|
'name' => 'SFR / Neuf / Cegetel',
|
|
'category' => 'Telco FR',
|
|
'domains' => 'sfr.fr, neuf.fr, cegetel.net',
|
|
'filter' => 'SpamAssassin + Cloudmark',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, SORBS, SpamCop',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'Throttling AGRESSIF sur nouvelles IPs',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '15/h',
|
|
'headers' => "X-Priority: 3\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'Warmup très progressif, éviter burst',
|
|
'domains_inbox' => '.fr, .com domains',
|
|
'color' => '#e60000'
|
|
],
|
|
'free' => [
|
|
'name' => 'Free / Proxad / Alice',
|
|
'category' => 'Telco FR',
|
|
'domains' => 'free.fr, aliceadsl.fr, proxad.net',
|
|
'filter' => 'SpamAssassin + Greylisting',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, SORBS',
|
|
'auth' => 'SPF, PTR OBLIGATOIRE',
|
|
'special' => 'PTR record CRITIQUE, greylisting actif',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'Retry après greylisting, PTR doit matcher HELO',
|
|
'domains_inbox' => '.fr domains avec PTR valide',
|
|
'color' => '#cd1e25'
|
|
],
|
|
|
|
// === UK ===
|
|
'virginmedia' => [
|
|
'name' => 'Virgin Media UK',
|
|
'category' => 'Cable UK',
|
|
'domains' => 'virginmedia.com, virgin.net, ntlworld.com',
|
|
'filter' => 'Cloudmark + Spamhaus',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, CBL',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'UK IP préférée, PECR compliance',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '15/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'Contenu UK, unsubscribe visible',
|
|
'domains_inbox' => '.co.uk, .com aged',
|
|
'color' => '#e4002b'
|
|
],
|
|
|
|
// === ITALIE ===
|
|
'alice_it' => [
|
|
'name' => 'Alice / TIM Italia',
|
|
'category' => 'Telco IT',
|
|
'domains' => 'alice.it, tin.it, tim.it, virgilio.it',
|
|
'filter' => 'SpamAssassin + Internal',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, SORBS',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'IP EU préférée, contenu IT apprécié',
|
|
'max_smtp_out' => 3,
|
|
'msg_rate' => '20/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>\nContent-Language: it",
|
|
'body_tips' => 'Contenu italien, style professionnel',
|
|
'domains_inbox' => '.it, .com domains',
|
|
'color' => '#003d8f'
|
|
],
|
|
|
|
// === CANADA ===
|
|
'videotron' => [
|
|
'name' => 'Videotron (Quebec)',
|
|
'category' => 'Cable CA',
|
|
'domains' => 'videotron.ca, videotron.qc.ca',
|
|
'filter' => 'SpamAssassin',
|
|
'strictness' => 'Moyen',
|
|
'blacklists' => 'Spamhaus, SpamCop',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'CASL compliance OBLIGATOIRE, IP CA préférée',
|
|
'max_smtp_out' => 3,
|
|
'msg_rate' => '20/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'Consentement explicite requis (CASL)',
|
|
'domains_inbox' => '.ca, .com domains',
|
|
'color' => '#003da5'
|
|
],
|
|
'bell' => [
|
|
'name' => 'Bell Canada / Sympatico',
|
|
'category' => 'Telco CA',
|
|
'domains' => 'bell.ca, sympatico.ca, bell.net',
|
|
'filter' => 'Cloudmark',
|
|
'strictness' => 'Moyen-Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, SpamCop',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'CASL compliance, IP canadienne préférée',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '15/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'CASL opt-in requis, contenu bilingue apprécié',
|
|
'domains_inbox' => '.ca domains, CASL compliant',
|
|
'color' => '#0069aa'
|
|
],
|
|
|
|
// === USA CABLE ===
|
|
'spectrum' => [
|
|
'name' => 'Spectrum / Charter / TWC',
|
|
'category' => 'Cable US',
|
|
'domains' => 'spectrum.net, charter.net, twc.com, rr.com',
|
|
'filter' => 'SpamAssassin + Proofpoint',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Proofpoint, CBL',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'CAN-SPAM compliance, Postmaster contact',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>\nList-Unsubscribe-Post: List-Unsubscribe=One-Click\nPrecedence: bulk",
|
|
'body_tips' => 'Physical address required, clear unsubscribe',
|
|
'domains_inbox' => '.com aged, CAN-SPAM compliant',
|
|
'color' => '#0099dc'
|
|
],
|
|
'comcast' => [
|
|
'name' => 'Comcast / Xfinity',
|
|
'category' => 'Cable US',
|
|
'domains' => 'comcast.net, xfinity.com',
|
|
'filter' => 'Cloudmark',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, CBL',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'Postmaster contact pour whitelisting',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'CAN-SPAM compliance stricte',
|
|
'domains_inbox' => '.com aged, Cloudmark clean',
|
|
'color' => '#000000'
|
|
],
|
|
'att' => [
|
|
'name' => 'AT&T / SBC / BellSouth',
|
|
'category' => 'Telco US',
|
|
'domains' => 'att.net, sbcglobal.net, bellsouth.net',
|
|
'filter' => 'Cloudmark + Barracuda',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Cloudmark CSI, Barracuda',
|
|
'auth' => 'SPF, DKIM',
|
|
'special' => 'Barracuda whitelist utile',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "X-Cloudmark-Authority: [domain]\nList-Unsubscribe: <[unsub]>",
|
|
'body_tips' => 'Barracuda reputation important',
|
|
'domains_inbox' => '.com aged, Barracuda clean',
|
|
'color' => '#009fdb'
|
|
],
|
|
|
|
// === APPLE ===
|
|
'icloud' => [
|
|
'name' => 'iCloud / Apple Mail',
|
|
'category' => 'Webmail',
|
|
'domains' => 'icloud.com, me.com, mac.com',
|
|
'filter' => 'Proofpoint',
|
|
'strictness' => 'Strict',
|
|
'blacklists' => 'Spamhaus, Proofpoint Dynamic',
|
|
'auth' => 'SPF, DKIM, DMARC',
|
|
'special' => 'Très peu de feedback disponible',
|
|
'max_smtp_out' => 2,
|
|
'msg_rate' => '10/h',
|
|
'headers' => "List-Unsubscribe: <[unsub]>\nX-Priority: 3",
|
|
'body_tips' => 'Design Apple-friendly, simplicité',
|
|
'domains_inbox' => '.com aged, clean history',
|
|
'color' => '#333333'
|
|
]
|
|
];
|
|
|
|
// ============================================
|
|
// SPAM FILTERS DATABASE
|
|
// ============================================
|
|
$spam_filters = [
|
|
'Google SpamBrain' => [
|
|
'isps' => ['Gmail', 'Google Workspace'],
|
|
'strictness' => 'Strict',
|
|
'detection' => 'Machine Learning, Engagement, Reputation',
|
|
'key_factors' => 'Engagement 24h, Text/HTML ratio, List-Unsubscribe-Post',
|
|
'headers_required' => "List-Unsubscribe\nList-Unsubscribe-Post\nFeedback-ID",
|
|
'body_rules' => 'Text version obligatoire, engagement crucial, éviter tracking pixels multiples',
|
|
'color' => '#ea4335'
|
|
],
|
|
'Microsoft SmartScreen' => [
|
|
'isps' => ['Hotmail', 'Outlook', 'Live', 'MSN', 'Office 365'],
|
|
'strictness' => 'Très Strict',
|
|
'detection' => 'Reputation, Content Filtering, SNDS',
|
|
'key_factors' => 'SNDS score, Ratio texte/image 80/20, Return Path certification',
|
|
'headers_required' => "X-MS-Exchange-Organization headers\nList-Unsubscribe-Post\nX-Mailer: Outlook",
|
|
'body_rules' => 'HTML clean sans JS, images HTTPS, footer avec adresse physique',
|
|
'color' => '#0078d4'
|
|
],
|
|
'Cloudmark' => [
|
|
'isps' => ['Yahoo', 'AOL', 'GMX', 'Ziggo', 'Bell', 'Comcast', 'AT&T', 'SFR'],
|
|
'strictness' => 'Strict',
|
|
'detection' => 'Fingerprinting, CSI Score, Pattern Matching',
|
|
'key_factors' => 'Cloudmark CSI score, variation content, CFL Feedback Loop',
|
|
'headers_required' => "X-Cloudmark-Authority\nList-Unsubscribe\nPrecedence: bulk",
|
|
'body_rules' => 'Varier subjects, éviter patterns répétitifs, CSA certification aide',
|
|
'color' => '#ff6b00'
|
|
],
|
|
'Vade Secure' => [
|
|
'isps' => ['Orange FR', 'SFR', 'Bouygues'],
|
|
'strictness' => 'Moyen-Strict',
|
|
'detection' => 'AI, Brand Protection, URL Scanning',
|
|
'key_factors' => 'Signal Spam FBL, IP française préférée, brand consistency',
|
|
'headers_required' => "List-Unsubscribe\nContent-Language: fr",
|
|
'body_rules' => 'Contenu français, Signal Spam inscription, IP FR',
|
|
'color' => '#00b4d8'
|
|
],
|
|
'SpamAssassin' => [
|
|
'isps' => ['Free FR', 'Videotron', 'KPN', 'T-Online', 'Alice IT'],
|
|
'strictness' => 'Moyen',
|
|
'detection' => 'Rule-based scoring, Bayesian',
|
|
'key_factors' => 'Score < 5.0, SPF/DKIM valid, PTR record',
|
|
'headers_required' => "List-Unsubscribe\nX-Priority: 3",
|
|
'body_rules' => 'HTML simple, éviter spam words, ratio équilibré',
|
|
'color' => '#28a745'
|
|
],
|
|
'Eleven/Cyren' => [
|
|
'isps' => ['T-Online', 'Deutsche Telekom'],
|
|
'strictness' => 'Strict',
|
|
'detection' => 'Pattern Analysis, Outbreak Detection',
|
|
'key_factors' => 'eco CSA certification, IP EU, contenu DE',
|
|
'headers_required' => "List-Unsubscribe\nContent-Language: de",
|
|
'body_rules' => 'Contenu allemand professionnel, eco CSA certification très utile',
|
|
'color' => '#e20074'
|
|
],
|
|
'Proofpoint' => [
|
|
'isps' => ['iCloud', 'Spectrum', 'Enterprise'],
|
|
'strictness' => 'Strict',
|
|
'detection' => 'Advanced Threat Protection, ML',
|
|
'key_factors' => 'Domain reputation, URL safety, content analysis',
|
|
'headers_required' => "List-Unsubscribe\nList-Unsubscribe-Post",
|
|
'body_rules' => 'URLs sur domaine principal, pas de raccourcis, contenu légitime',
|
|
'color' => '#0078be'
|
|
]
|
|
];
|
|
|
|
// Récupérer domaines Cloudflare et FreeDNS depuis DB
|
|
$cloudflare_domains = [];
|
|
$freedns_domains = [];
|
|
try {
|
|
$cfd = $pdo->query("SELECT domain FROM admin.cloudflare_zones WHERE status='active' LIMIT 50")->fetchAll(PDO::FETCH_COLUMN);
|
|
$cloudflare_domains = $cfd ?: [];
|
|
} catch(Exception $e) {}
|
|
try {
|
|
$fdd = $pdo->query("SELECT subdomain FROM admin.freedns_domains WHERE status='active' LIMIT 50")->fetchAll(PDO::FETCH_COLUMN);
|
|
$freedns_domains = $fdd ?: [];
|
|
} catch(Exception $e) {}
|
|
|
|
// Stats
|
|
$warmup_stats = [
|
|
'email' => $pdo->query("SELECT COUNT(*) FROM admin.warmup_assets WHERE asset_type='email'")->fetchColumn() ?: 0,
|
|
'ip' => $pdo->query("SELECT COUNT(*) FROM admin.warmup_assets WHERE asset_type='ip'")->fetchColumn() ?: 0,
|
|
'domain' => $pdo->query("SELECT COUNT(*) FROM admin.warmup_assets WHERE asset_type='domain'")->fetchColumn() ?: 0,
|
|
];
|
|
|
|
// Handle Header/Body generation
|
|
$generated_output = '';
|
|
if ($_POST && $_POST['action'] === 'generate_template') {
|
|
$target_isp = $_POST['target_isp'] ?? 'gmail';
|
|
$input_header = $_POST['input_header'] ?? '';
|
|
$input_body = $_POST['input_body'] ?? '';
|
|
|
|
$isp = $isp_database[$target_isp] ?? $isp_database['gmail'];
|
|
|
|
// Generate optimized template
|
|
$generated_output = "=== TEMPLATE OPTIMISÉ POUR {$isp['name']} ===\n";
|
|
$generated_output .= "Filtre: {$isp['filter']} ({$isp['strictness']})\n\n";
|
|
$generated_output .= "--- HEADERS RECOMMANDÉS ---\n";
|
|
$generated_output .= "MIME-Version: 1.0\n";
|
|
$generated_output .= "Message-ID: <[an_5][n_5]@[domain]>\n";
|
|
$generated_output .= "From: [from_name] <[a_7]@[domain]>\n";
|
|
$generated_output .= "Subject: [subject]\n";
|
|
$generated_output .= "To: [email]\n";
|
|
$generated_output .= "Content-Type: text/html; charset=UTF-8\n";
|
|
$generated_output .= str_replace("\\n", "\n", $isp['headers']) . "\n\n";
|
|
$generated_output .= "--- BODY TIPS ---\n";
|
|
$generated_output .= $isp['body_tips'] . "\n\n";
|
|
$generated_output .= "--- DOMAINES INBOX ---\n";
|
|
$generated_output .= $isp['domains_inbox'] . "\n";
|
|
}
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Deliverability Hub - WEVAL</title>
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
<style>
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #0f172a 100%); min-height: 100vh; color: #e2e8f0; }
|
|
.container { max-width: 1800px; margin: 0 auto; padding: 20px; }
|
|
|
|
.header { text-align: center; padding: 30px; background: rgba(255,255,255,0.03); border-radius: 20px; margin-bottom: 30px; border: 1px solid rgba(255,255,255,0.1); }
|
|
.header h1 { font-size: 32px; margin-bottom: 10px; background: linear-gradient(135deg, #f97316, #8b5cf6, #22d3ee); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
|
|
.header p { color: #64748b; }
|
|
|
|
.quick-links { display: flex; justify-content: center; gap: 15px; margin-top: 20px; flex-wrap: wrap; }
|
|
.quick-link { padding: 10px 20px; background: rgba(139,92,246,0.2); color: #a5b4fc; text-decoration: none; border-radius: 10px; font-size: 13px; transition: all 0.3s; }
|
|
.quick-link:hover { background: rgba(139,92,246,0.4); transform: translateY(-2px); }
|
|
|
|
.tabs { display: flex; gap: 5px; margin-bottom: 25px; background: rgba(255,255,255,0.03); padding: 8px; border-radius: 12px; flex-wrap: wrap; }
|
|
.tab { padding: 12px 20px; background: transparent; border: none; color: #94a3b8; cursor: pointer; border-radius: 8px; font-size: 13px; font-weight: 500; transition: all 0.3s; display: flex; align-items: center; gap: 8px; }
|
|
.tab:hover { background: rgba(255,255,255,0.05); }
|
|
.tab.active { background: linear-gradient(135deg, #8b5cf6, #6366f1); color: white; }
|
|
|
|
.tab-content { display: none; animation: fadeIn 0.3s; }
|
|
.tab-content.active { display: block; }
|
|
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
|
|
|
|
.grid { display: grid; gap: 20px; }
|
|
.grid-2 { grid-template-columns: repeat(2, 1fr); }
|
|
.grid-3 { grid-template-columns: repeat(3, 1fr); }
|
|
.grid-4 { grid-template-columns: repeat(4, 1fr); }
|
|
|
|
.card { background: rgba(255,255,255,0.03); border-radius: 16px; padding: 25px; border: 1px solid rgba(255,255,255,0.08); }
|
|
.card h3 { font-size: 16px; margin-bottom: 20px; display: flex; align-items: center; gap: 10px; }
|
|
|
|
.isp-card { padding: 15px; background: rgba(255,255,255,0.02); border-radius: 12px; cursor: pointer; transition: all 0.3s; border: 2px solid transparent; }
|
|
.isp-card:hover { background: rgba(255,255,255,0.05); transform: translateY(-2px); }
|
|
.isp-card.selected { border-color: #8b5cf6; background: rgba(139,92,246,0.1); }
|
|
.isp-card .name { font-weight: 600; font-size: 13px; margin-bottom: 5px; }
|
|
.isp-card .filter { font-size: 10px; color: #64748b; margin-bottom: 5px; }
|
|
.isp-card .badge { display: inline-block; padding: 3px 8px; border-radius: 10px; font-size: 9px; }
|
|
.isp-card .badge.strict { background: rgba(239,68,68,0.2); color: #f87171; }
|
|
.isp-card .badge.medium { background: rgba(251,191,36,0.2); color: #fbbf24; }
|
|
|
|
.filter-card { padding: 20px; border-radius: 12px; border-left: 4px solid; }
|
|
.filter-card h4 { font-size: 14px; margin-bottom: 10px; }
|
|
.filter-card .isps { font-size: 11px; color: #64748b; margin-bottom: 10px; }
|
|
.filter-card .rules { font-size: 12px; color: #94a3b8; line-height: 1.6; }
|
|
|
|
.form-group { margin-bottom: 15px; }
|
|
.form-group label { display: block; font-size: 12px; color: #94a3b8; margin-bottom: 6px; }
|
|
.form-group input, .form-group select, .form-group textarea { width: 100%; padding: 12px; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.1); border-radius: 10px; color: #e2e8f0; font-size: 13px; }
|
|
.form-group textarea { font-family: monospace; }
|
|
|
|
.btn { padding: 12px 25px; border: none; border-radius: 10px; cursor: pointer; font-weight: 600; font-size: 14px; transition: all 0.3s; display: inline-flex; align-items: center; gap: 8px; }
|
|
.btn-primary { background: linear-gradient(135deg, #8b5cf6, #6366f1); color: white; }
|
|
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 5px 20px rgba(139,92,246,0.4); }
|
|
|
|
.output-box { background: rgba(0,0,0,0.4); padding: 20px; border-radius: 12px; font-family: monospace; font-size: 12px; white-space: pre-wrap; color: #94a3b8; max-height: 400px; overflow-y: auto; }
|
|
|
|
.domain-list { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
.domain-tag { padding: 5px 12px; background: rgba(34,211,238,0.1); color: #22d3ee; border-radius: 15px; font-size: 11px; }
|
|
.domain-tag.freedns { background: rgba(52,211,153,0.1); color: #34d399; }
|
|
|
|
.stats-row { display: flex; gap: 20px; justify-content: center; margin-bottom: 30px; }
|
|
.stat { text-align: center; padding: 15px 30px; background: rgba(255,255,255,0.03); border-radius: 12px; }
|
|
.stat .value { font-size: 28px; font-weight: 700; background: linear-gradient(135deg, #a78bfa, #22d3ee); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
|
|
.stat .label { font-size: 11px; color: #64748b; }
|
|
|
|
@media (max-width: 1200px) { .grid-3, .grid-4 { grid-template-columns: repeat(2, 1fr); } }
|
|
@media (max-width: 768px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }
|
|
</style>
|
|
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h1>🎯 Deliverability Hub</h1>
|
|
<p>ISP Mapping • Spam Filters • Header/Body Generator • Domain Ranking • Warmup Intégré</p>
|
|
<div class="quick-links">
|
|
<a href="warmup-pro.php" class="quick-link"><i class="fas fa-fire"></i> Warmup Pro</a>
|
|
<a href="deliverability-playground.php" class="quick-link"><i class="fas fa-flask"></i> Playground</a>
|
|
<a href="email-warmup.php" class="quick-link"><i class="fas fa-envelope"></i> Email Warmup</a>
|
|
<a href="/tools/blacklist.html" class="quick-link"><i class="fas fa-ban"></i> Blacklist Check</a>
|
|
<a href="/tools/spf-lookup.html" class="quick-link"><i class="fas fa-shield-alt"></i> SPF/DKIM</a>
|
|
<a href="/tools/mailbox-extractor.html" class="quick-link"><i class="fas fa-inbox"></i> Mailbox Extractor</a>
|
|
<a href="freedns-config.php" class="quick-link"><i class="fas fa-globe"></i> FreeDNS</a>
|
|
<a href="hamid-dashboard.php" class="quick-link"><i class="fas fa-robot"></i> WEVAL MIND</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="stats-row">
|
|
<div class="stat"><div class="value"><?= count($isp_database) ?></div><div class="label">ISPs</div></div>
|
|
<div class="stat"><div class="value"><?= count($spam_filters) ?></div><div class="label">Spam Filters</div></div>
|
|
<div class="stat"><div class="value"><?= $warmup_stats['email'] ?></div><div class="label">Email Warmup</div></div>
|
|
<div class="stat"><div class="value"><?= $warmup_stats['ip'] ?></div><div class="label">IP Warmup</div></div>
|
|
<div class="stat"><div class="value"><?= count($cloudflare_domains) ?></div><div class="label">Cloudflare Domains</div></div>
|
|
<div class="stat"><div class="value"><?= count($freedns_domains) ?></div><div class="label">FreeDNS Domains</div></div>
|
|
</div>
|
|
|
|
<div class="tabs">
|
|
<button class="tab active" onclick="showTab('isps')"><i class="fas fa-server"></i> ISPs Database</button>
|
|
<button class="tab" onclick="showTab('filters')"><i class="fas fa-filter"></i> Spam Filters</button>
|
|
<button class="tab" onclick="showTab('generator')"><i class="fas fa-magic"></i> Header/Body Generator</button>
|
|
<button class="tab" onclick="showTab('domains')"><i class="fas fa-globe"></i> Domain Ranking</button>
|
|
<button class="tab" onclick="showTab('tools')"><i class="fas fa-tools"></i> Outils Intégrés</button>
|
|
</div>
|
|
|
|
<!-- TAB 1: ISPs Database -->
|
|
<div id="isps" class="tab-content active">
|
|
<div class="grid grid-4">
|
|
<?php foreach ($isp_database as $key => $isp):
|
|
$strictClass = strpos($isp['strictness'], 'Strict') !== false ? 'strict' : 'medium';
|
|
?>
|
|
<div class="isp-card" onclick="showIspDetail('<?= $key ?>')" style="border-left: 4px solid <?= $isp['color'] ?>">
|
|
<div class="name"><?= $isp['name'] ?></div>
|
|
<div class="filter"><i class="fas fa-shield-alt"></i> <?= $isp['filter'] ?></div>
|
|
<div><span class="badge <?= $strictClass ?>"><?= $isp['strictness'] ?></span></div>
|
|
<div style="font-size:10px;color:#64748b;margin-top:5px"><?= $isp['category'] ?></div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<div id="isp-detail" class="card" style="margin-top:25px;display:none">
|
|
<!-- ISP detail will appear here -->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TAB 2: Spam Filters -->
|
|
<div id="filters" class="tab-content">
|
|
<div class="grid grid-2">
|
|
<?php foreach ($spam_filters as $name => $filter): ?>
|
|
<div class="filter-card" style="background:rgba(0,0,0,0.3);border-color:<?= $filter['color'] ?>">
|
|
<h4 style="color:<?= $filter['color'] ?>"><?= $name ?></h4>
|
|
<div class="isps"><strong>ISPs:</strong> <?= implode(', ', $filter['isps']) ?></div>
|
|
<div class="rules">
|
|
<strong>Détection:</strong> <?= $filter['detection'] ?><br>
|
|
<strong>Facteurs clés:</strong> <?= $filter['key_factors'] ?><br>
|
|
<strong>Headers requis:</strong><br><code style="font-size:10px"><?= str_replace("\n", ", ", $filter['headers_required']) ?></code><br>
|
|
<strong>Body rules:</strong> <?= $filter['body_rules'] ?>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TAB 3: Header/Body Generator -->
|
|
<div id="generator" class="tab-content">
|
|
<div class="grid grid-2">
|
|
<div class="card">
|
|
<h3><i class="fas fa-cogs"></i> Générateur de Template</h3>
|
|
<form method="POST">
|
|
<input type="hidden" name="action" value="generate_template">
|
|
<div class="form-group">
|
|
<label>ISP Cible</label>
|
|
<select name="target_isp">
|
|
<?php foreach ($isp_database as $key => $isp): ?>
|
|
<option value="<?= $key ?>"><?= $isp['name'] ?> (<?= $isp['filter'] ?>)</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Header Source (optionnel - depuis Mailbox Extractor)</label>
|
|
<textarea name="input_header" rows="6" placeholder="Collez un header extrait ici..."></textarea>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Body Source (optionnel)</label>
|
|
<textarea name="input_body" rows="6" placeholder="Collez un body HTML ici..."></textarea>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary"><i class="fas fa-magic"></i> Générer Template Optimisé</button>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h3><i class="fas fa-file-code"></i> Output</h3>
|
|
<?php if ($generated_output): ?>
|
|
<div class="output-box"><?= htmlspecialchars($generated_output) ?></div>
|
|
<?php else: ?>
|
|
<div style="text-align:center;padding:60px;color:#64748b">
|
|
<i class="fas fa-arrow-left" style="font-size:48px;opacity:0.3;margin-bottom:20px;display:block"></i>
|
|
<p>Sélectionnez un ISP et cliquez sur Générer</p>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TAB 4: Domain Ranking -->
|
|
<div id="domains" class="tab-content">
|
|
<div class="grid grid-2">
|
|
<div class="card">
|
|
<h3><i class="fas fa-cloud"></i> Domaines Cloudflare (<?= count($cloudflare_domains) ?>)</h3>
|
|
<div class="domain-list">
|
|
<?php foreach ($cloudflare_domains as $d): ?>
|
|
<span class="domain-tag"><?= htmlspecialchars($d) ?></span>
|
|
<?php endforeach; ?>
|
|
<?php if (empty($cloudflare_domains)): ?>
|
|
<span style="color:#64748b">Aucun domaine Cloudflare configuré</span>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h3><i class="fas fa-globe"></i> Domaines FreeDNS (<?= count($freedns_domains) ?>)</h3>
|
|
<div class="domain-list">
|
|
<?php foreach ($freedns_domains as $d): ?>
|
|
<span class="domain-tag freedns"><?= htmlspecialchars($d) ?></span>
|
|
<?php endforeach; ?>
|
|
<?php if (empty($freedns_domains)): ?>
|
|
<span style="color:#64748b">Aucun domaine FreeDNS configuré</span>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card" style="margin-top:25px">
|
|
<h3><i class="fas fa-trophy"></i> Ranking Domaines par ISP</h3>
|
|
<table style="width:100%;font-size:12px;border-collapse:collapse">
|
|
<tr style="background:rgba(139,92,246,0.1)">
|
|
<th style="padding:12px;text-align:left">ISP</th>
|
|
<th style="padding:12px;text-align:left">Domaines Recommandés</th>
|
|
<th style="padding:12px;text-align:left">À Éviter</th>
|
|
</tr>
|
|
<?php foreach ($isp_database as $key => $isp): ?>
|
|
<tr style="border-bottom:1px solid rgba(255,255,255,0.05)">
|
|
<td style="padding:10px"><strong><?= $isp['name'] ?></strong></td>
|
|
<td style="padding:10px;color:#34d399"><?= $isp['domains_inbox'] ?></td>
|
|
<td style="padding:10px;color:#f87171">.xyz, .top, .info, newly registered</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TAB 5: Outils Intégrés -->
|
|
<div id="tools" class="tab-content">
|
|
<div class="grid grid-3">
|
|
<a href="/tools/blacklist.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#f87171"><i class="fas fa-ban"></i> Blacklist Checker</h3>
|
|
<p style="color:#64748b;font-size:13px">Vérifie Spamhaus, Barracuda, Cloudmark CSI, SpamCop, SORBS...</p>
|
|
</a>
|
|
<a href="/tools/spf-lookup.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#22d3ee"><i class="fas fa-shield-alt"></i> SPF/DKIM Lookup</h3>
|
|
<p style="color:#64748b;font-size:13px">Valide configuration SPF, DKIM, DMARC de vos domaines</p>
|
|
</a>
|
|
<a href="/tools/mailbox-extractor.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#a78bfa"><i class="fas fa-inbox"></i> Mailbox Extractor</h3>
|
|
<p style="color:#64748b;font-size:13px">Extrait headers/body depuis Gmail, Hotmail, Yahoo, Videotron...</p>
|
|
</a>
|
|
<a href="freedns-config.php" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#34d399"><i class="fas fa-globe"></i> FreeDNS Manager</h3>
|
|
<p style="color:#64748b;font-size:13px">Gère domaines FreeDNS pour Office 365 verification</p>
|
|
</a>
|
|
<a href="/cloudflare-accounts.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#f97316"><i class="fas fa-cloud"></i> Cloudflare Domains</h3>
|
|
<p style="color:#64748b;font-size:13px">DNS management via Cloudflare API</p>
|
|
</a>
|
|
<a href="/pmta/route-vmtas.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#fbbf24"><i class="fas fa-server"></i> PMTA Config</h3>
|
|
<p style="color:#64748b;font-size:13px">Configure max-smtp-out, msg-rate, backoff par ISP</p>
|
|
</a>
|
|
<a href="hamid-dashboard.php" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#8b5cf6"><i class="fas fa-robot"></i> WEVAL MIND</h3>
|
|
<p style="color:#64748b;font-size:13px">Conseils temps réel, génération templates, debug</p>
|
|
</a>
|
|
<a href="/production/send-process.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#ec4899"><i class="fas fa-paper-plane"></i> Send Page</h3>
|
|
<p style="color:#64748b;font-size:13px">Envoi de campagnes avec monitoring</p>
|
|
</a>
|
|
<a href="/tracking/links.html" class="card" style="text-decoration:none;color:inherit">
|
|
<h3 style="color:#06b6d4"><i class="fas fa-link"></i> Tracking</h3>
|
|
<p style="color:#64748b;font-size:13px">Opens, clicks, unsubscribes tracking</p>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function showTab(tab) {
|
|
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
|
document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
|
|
event.target.classList.add('active');
|
|
document.getElementById(tab).classList.add('active');
|
|
}
|
|
|
|
const ispData = <?= json_encode($isp_database) ?>;
|
|
|
|
function showIspDetail(key) {
|
|
const isp = ispData[key];
|
|
if (!isp) return;
|
|
|
|
document.querySelectorAll('.isp-card').forEach(c => c.classList.remove('selected'));
|
|
event.target.closest('.isp-card').classList.add('selected');
|
|
|
|
const detail = document.getElementById('isp-detail');
|
|
detail.style.display = 'block';
|
|
detail.innerHTML = `
|
|
<h3 style="color:${isp.color};margin-bottom:20px">${isp.name}</h3>
|
|
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:20px">
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">DOMAINES</h4>
|
|
<p style="font-size:13px">${isp.domains}</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">FILTRE SPAM</h4>
|
|
<p style="font-size:13px">${isp.filter} (${isp.strictness})</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">AUTH REQUIS</h4>
|
|
<p style="font-size:13px">${isp.auth}</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">BLACKLISTS</h4>
|
|
<p style="font-size:13px">${isp.blacklists}</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">LIMITES PMTA</h4>
|
|
<p style="font-size:13px">max-smtp-out: ${isp.max_smtp_out}, rate: ${isp.msg_rate}</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">PARTICULARITÉS</h4>
|
|
<p style="font-size:13px">${isp.special}</p>
|
|
</div>
|
|
<div style="grid-column:span 3">
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">HEADERS RECOMMANDÉS</h4>
|
|
<pre style="background:rgba(0,0,0,0.3);padding:10px;border-radius:8px;font-size:11px;color:#94a3b8">${isp.headers.replace(/\\n/g, '\n')}</pre>
|
|
</div>
|
|
<div style="grid-column:span 2">
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">BODY TIPS</h4>
|
|
<p style="font-size:13px">${isp.body_tips}</p>
|
|
</div>
|
|
<div>
|
|
<h4 style="color:#64748b;font-size:11px;margin-bottom:8px">DOMAINES INBOX</h4>
|
|
<p style="font-size:13px;color:#34d399">${isp.domains_inbox}</p>
|
|
</div>
|
|
</div>
|
|
`;
|
|
detail.scrollIntoView({ behavior: 'smooth' });
|
|
}
|
|
</script>
|
|
|
|
<?php include("includes/chatbot-widget.php"); ?>
|
|
|
|
</body>
|
|
</html>
|