Jarvis Health

Serveur : 54.37.228.99
Utilisateur : ubuntu

Mail Hub

Gestion centralisée des emails pour vos sites

Configuration globale

URL à utiliser dans vos sites pour envoyer des emails

Clé requise dans le header X-MAIL-HUB-KEY

Comment ça fonctionne ?

1. Hub centralisé

Le Mail Hub reçoit les demandes d'envoi d'emails depuis vos sites via l'API /api/mail-hub

2. Sécurité double

Authentification en 2 niveaux : Master Key (commune) + Secret unique par site. Rate limiting : 10 emails/minute.

3. Amazon SES

Envoi via Amazon SES depuis noreply@dev-digiflow.fr vers l'email du proprio configuré.

Flux d'un email

Formulaire site → POST /api/mail-hub (avec headers) → Validation secret → Amazon SES → Email proprio ✅
Guide complet d'intégration
1

Créer le site dans Jarvis Mail Hub

▶ Cliquez sur le bouton "Ajouter un site" en haut de cette page

Remplissez le formulaire :

  • ID du site : un identifiant unique (ex: mon-site-vitrine)
  • Nom du site : le nom affiché dans les emails (ex: Mon Site Vitrine)
  • Email du propriétaire : où vous voulez recevoir les emails (ex: contact@monsite.fr)

📋 Vous aurez 3 informations à copier :

  • Master Key (depuis la section violette "Configuration globale" ⬆️)
  • SITE_ID (l'ID que vous avez choisi)
  • SITE_SECRET (généré automatiquement, dans la popup)
2

Ajouter les variables d'environnement dans le site

▶ Ouvrez le fichier .env de votre site (ou .env.local pour Next.js)

# ======================================== # MAIL HUB - Jarvis Health Manager # ======================================== # Master Key (commune à tous vos sites) MAIL_HUB_KEY=e6141ae6b17f34efd87f16268f4af787aa9b39399d716bc6a1956a933a17f212 # Identifiant unique de ce site SITE_ID=mon-site-vitrine # Secret unique généré lors de la création (ne JAMAIS partager!) SITE_SECRET=abc123def456...copiez-le-secret-ici
3

Modifier la route de contact

🟦 Pour un site Next.js / React :

▶ Remplacez le contenu de app/api/contact/route.ts par :

import { NextRequest, NextResponse } from 'next/server'; export async function POST(req: NextRequest) { try { // 1. Récupérer les données du formulaire const { name, email, message, subject } = await req.json(); // 2. Validation basique if (!name || !email || !message) { return NextResponse.json( { error: 'Tous les champs sont requis' }, { status: 400 } ); } // 3. Appeler le Mail Hub const response = await fetch('https://jarvis-health.fr/api/mail-hub', { method: 'POST', headers: { 'X-MAIL-HUB-KEY': process.env.MAIL_HUB_KEY!, 'X-SITE-ID': process.env.SITE_ID!, 'X-SITE-SECRET': process.env.SITE_SECRET!, 'Content-Type': 'application/json' }, body: JSON.stringify({ subject: subject || `Nouveau contact depuis ${name}`, message: ` <div style="font-family: Arial, sans-serif;"> <h2>Nouveau message de contact</h2> <p><strong>Nom:</strong> ${name}</p> <p><strong>Email:</strong> ${email}</p> <hr> <p><strong>Message:</strong></p> <p>${message.replace(/\n/g, '<br>')}</p> </div> `, replyTo: email }) }); const data = await response.json(); // 4. Retourner le résultat if (response.ok) { return NextResponse.json({ success: true, message: 'Email envoyé avec succès !' }); } else { return NextResponse.json( { error: data.error || 'Erreur lors de l'envoi' }, { status: response.status } ); } } catch (error: any) { console.error('Erreur contact:', error); return NextResponse.json( { error: 'Erreur serveur' }, { status: 500 } ); } }

✅ Ce que fait ce code :

  • Récupère les données du formulaire (name, email, message)
  • Valide que tous les champs sont remplis
  • Envoie vers le Mail Hub avec vos credentials
  • Retourne une réponse (succès ou erreur)

🟧 Pour un site PHP :

▶ Créez ou modifiez api/contact.php :

<?php header('Content-Type: application/json'); // 1. Récupérer les données du formulaire $name = $_POST['name'] ?? ''; $email = $_POST['email'] ?? ''; $message = $_POST['message'] ?? ''; // 2. Validation basique if (empty($name) || empty($email) || empty($message)) { echo json_encode(['error' => 'Tous les champs sont requis']); exit; } // 3. Charger les variables d'environnement // Option A: Depuis .env avec vlucas/phpdotenv // require 'vendor/autoload.php'; // $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); // $dotenv->load(); // Option B: Définir directement (moins sécurisé) define('MAIL_HUB_KEY', 'e6141ae6b17f34efd...'); define('SITE_ID', 'mon-site-vitrine'); define('SITE_SECRET', 'abc123def456...'); // 4. Préparer les données $data = [ 'subject' => "Nouveau contact depuis " . $name, 'message' => " <div style='font-family: Arial, sans-serif;'> <h2>Nouveau message de contact</h2> <p><strong>Nom:</strong> " . htmlspecialchars($name) . "</p> <p><strong>Email:</strong> " . htmlspecialchars($email) . "</p> <hr> <p><strong>Message:</strong></p> <p>" . nl2br(htmlspecialchars($message)) . "</p> </div> ", 'replyTo' => $email ]; // 5. Appeler le Mail Hub avec cURL $ch = curl_init('https://jarvis-health.fr/api/mail-hub'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'X-MAIL-HUB-KEY: ' . MAIL_HUB_KEY, 'X-SITE-ID: ' . SITE_ID, 'X-SITE-SECRET: ' . SITE_SECRET, 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 6. Retourner le résultat if ($httpCode === 200) { echo json_encode(['success' => true, 'message' => 'Email envoyé !']); } else { echo json_encode(['error' => 'Erreur lors de l\'envoi']); } ?>
4

Nettoyer l'ancien code

🗑️ Supprimez tout l'ancien code d'envoi d'email :

À supprimer :

  • npm uninstall nodemailer (Next.js)
  • Anciens credentials SMTP (Gmail, SendGrid, etc.)
  • Code nodemailer.createTransport()
  • Anciennes variables d'environnement SMTP

Avantages : Plus besoin de gérer les credentials SMTP, tout est centralisé !

5

Tester et vérifier

🧪 Procédure de test :

  1. Redémarrez votre serveur de développement
  2. Allez sur le formulaire de contact de votre site
  3. Remplissez et envoyez un message de test
  4. Revenez sur cette page Jarvis
  5. Scrollez en bas dans "Logs récents" ⬇️
  6. Vérifiez que l'email apparaît avec ✅ (succès)
  7. Vérifiez votre boîte email (celle du propriétaire)

⚠️ Si ça ne fonctionne pas :

  • Vérifiez les 3 variables dans .env (MAIL_HUB_KEY, SITE_ID, SITE_SECRET)
  • Vérifiez que le serveur a bien redémarré après modification du .env
  • Regardez les logs dans la console du navigateur (F12)
  • Regardez les "Logs récents" en bas de cette page pour voir l'erreur
  • Vérifiez que le site est bien activé (badge vert dans la liste des sites)
🤖 Automatisation avec Claude AI

Instructions pour Claude AI

# MISSION : Intégrer le Mail Hub Jarvis dans ce site existant ## CONTEXTE Ce site possède actuellement un formulaire de contact qui envoie des emails. Je veux le migrer vers le système Mail Hub centralisé de Jarvis Health Manager pour : - Utiliser un seul compte Amazon SES pour tous mes sites - Centraliser la gestion des emails - Simplifier la maintenance ## INFORMATIONS DU SITE (à compléter par l'utilisateur) - **SITE_ID** : [ex: mon-site-vitrine] - **SITE_SECRET** : [généré depuis Jarvis, à copier depuis la popup] - **MASTER_KEY** : e6141ae6b17f34efd87f16268f4af787aa9b39399d716bc6a1956a933a17f212 - **Email du propriétaire** : [ex: contact@monsite.fr] ## ÉTAPES À SUIVRE ### 1. ANALYSE DU SITE EXISTANT - Utilise `Glob` pour trouver tous les fichiers de routes API (app/api/**/route.ts, pages/api/**/*.ts, ou *.php) - Identifie le fichier qui gère l'envoi d'emails de contact (cherche "nodemailer", "mail", "smtp", "sendgrid", etc.) - Lis le fichier identifié et analyse la structure actuelle - Liste les dépendances email actuelles (package.json pour Next.js, composer.json pour PHP) ### 2. CRÉER LE SITE DANS JARVIS (si pas encore fait) Si l'utilisateur n'a pas encore créé le site dans Jarvis : - Demande-lui d'aller sur https://jarvis-health.fr/mail-hub - Demande-lui de cliquer sur "Ajouter un site" - Demande-lui de renseigner : - ID du site : [identifiant unique, ex: mon-site-vitrine] - Nom du site : [nom affiché dans les emails] - Email du propriétaire : [où recevoir les emails] - Demande-lui de COPIER le SITE_SECRET qui sera affiché une seule fois - Attends qu'il te fournisse le SITE_ID et le SITE_SECRET avant de continuer ### 3. AJOUTER LES VARIABLES D'ENVIRONNEMENT - Trouve le fichier .env ou .env.local (ou crée-le s'il n'existe pas) - Ajoute les 3 variables suivantes (utilise les valeurs fournies par l'utilisateur) : ```bash # ======================================== # MAIL HUB - Jarvis Health Manager # ======================================== # Master Key (commune à tous les sites) MAIL_HUB_KEY=e6141ae6b17f34efd87f16268f4af787aa9b39399d716bc6a1956a933a17f212 # Identifiant unique de ce site SITE_ID=[SITE_ID fourni par l'utilisateur] # Secret unique généré lors de la création SITE_SECRET=[SITE_SECRET fourni par l'utilisateur] ``` ### 4. MODIFIER LA ROUTE DE CONTACT **Pour Next.js (TypeScript/JavaScript) :** Remplace le contenu du fichier de route API par : ```typescript import { NextRequest, NextResponse } from 'next/server'; export async function POST(req: NextRequest) { try { // 1. Récupérer les données du formulaire const { name, email, message, subject } = await req.json(); // 2. Validation basique if (!name || !email || !message) { return NextResponse.json( { error: 'Tous les champs sont requis' }, { status: 400 } ); } // 3. Appeler le Mail Hub const response = await fetch('https://jarvis-health.fr/api/mail-hub', { method: 'POST', headers: { 'X-MAIL-HUB-KEY': process.env.MAIL_HUB_KEY!, 'X-SITE-ID': process.env.SITE_ID!, 'X-SITE-SECRET': process.env.SITE_SECRET!, 'Content-Type': 'application/json' }, body: JSON.stringify({ subject: subject || `Nouveau contact depuis ${name}`, message: ` <div style="font-family: Arial, sans-serif;"> <h2>Nouveau message de contact</h2> <p><strong>Nom:</strong> ${name}</p> <p><strong>Email:</strong> ${email}</p> <hr> <p><strong>Message:</strong></p> <p>${message.replace(/\n/g, '<br>')}</p> </div> `, replyTo: email }) }); const data = await response.json(); // 4. Retourner le résultat if (response.ok) { return NextResponse.json({ success: true, message: 'Email envoyé avec succès !' }); } else { return NextResponse.json( { error: data.error || 'Erreur lors de l\'envoi' }, { status: response.status } ); } } catch (error: any) { console.error('Erreur contact:', error); return NextResponse.json( { error: 'Erreur serveur' }, { status: 500 } ); } } ``` **Pour PHP :** Remplace le contenu du fichier de contact PHP par : ```php <?php header('Content-Type: application/json'); // 1. Récupérer les données du formulaire $name = $_POST['name'] ?? ''; $email = $_POST['email'] ?? ''; $message = $_POST['message'] ?? ''; // 2. Validation basique if (empty($name) || empty($email) || empty($message)) { echo json_encode(['error' => 'Tous les champs sont requis']); exit; } // 3. Charger les variables d'environnement // Remplace par les vraies valeurs depuis le .env define('MAIL_HUB_KEY', getenv('MAIL_HUB_KEY')); define('SITE_ID', getenv('SITE_ID')); define('SITE_SECRET', getenv('SITE_SECRET')); // 4. Préparer les données $data = [ 'subject' => "Nouveau contact depuis " . $name, 'message' => " <div style='font-family: Arial, sans-serif;'> <h2>Nouveau message de contact</h2> <p><strong>Nom:</strong> " . htmlspecialchars($name) . "</p> <p><strong>Email:</strong> " . htmlspecialchars($email) . "</p> <hr> <p><strong>Message:</strong></p> <p>" . nl2br(htmlspecialchars($message)) . "</p> </div> ", 'replyTo' => $email ]; // 5. Appeler le Mail Hub avec cURL $ch = curl_init('https://jarvis-health.fr/api/mail-hub'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'X-MAIL-HUB-KEY: ' . MAIL_HUB_KEY, 'X-SITE-ID: ' . SITE_ID, 'X-SITE-SECRET: ' . SITE_SECRET, 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 6. Retourner le résultat if ($httpCode === 200) { echo json_encode(['success' => true, 'message' => 'Email envoyé !']); } else { echo json_encode(['error' => 'Erreur lors de l\'envoi']); } ?> ``` ### 5. NETTOYER L'ANCIEN CODE **Pour Next.js :** - Supprime nodemailer des dépendances : `npm uninstall nodemailer @types/nodemailer` - Supprime les anciennes variables d'environnement SMTP du .env (SMTP_HOST, SMTP_USER, SMTP_PASS, etc.) - Supprime tout code d'import ou d'utilisation de nodemailer **Pour PHP :** - Supprime les anciennes bibliothèques SMTP (PHPMailer, SwiftMailer, etc.) - Supprime les anciennes variables d'environnement SMTP ### 6. TESTER L'INTÉGRATION - Demande à l'utilisateur de redémarrer son serveur de développement - Demande-lui de tester le formulaire de contact - Demande-lui de vérifier les logs sur https://jarvis-health.fr/mail-hub (section "Logs récents") - Vérifie qu'un ✅ apparaît dans les logs - Demande-lui de vérifier sa boîte email ### 7. RAPPORT FINAL Fournis un rapport détaillé avec : - ✅ Liste des fichiers modifiés - ✅ Changements apportés (avant/après) - ✅ Dépendances supprimées - ✅ Variables d'environnement ajoutées/supprimées - ✅ Instructions pour le déploiement en production - ✅ Checklist de vérification ## RÈGLES IMPORTANTES - ❌ NE JAMAIS hardcoder les secrets dans le code (utilise toujours les variables d'environnement) - ❌ NE PAS continuer si l'utilisateur n'a pas fourni le SITE_ID et SITE_SECRET - ✅ Toujours demander confirmation avant de supprimer du code - ✅ Créer une sauvegarde de l'ancien code (ex: route.ts.backup) - ✅ Être explicite sur chaque modification ## NOTES - L'API Mail Hub est déjà configurée sur https://jarvis-health.fr/api/mail-hub - Les emails sont envoyés depuis noreply@dev-digiflow.fr via Amazon SES - Le rate limit est de 10 emails par minute par site - Tous les logs sont visibles sur https://jarvis-health.fr/mail-hub
Chargement...