/** * Script de debug pour tester le flux complet d'envoi d'email * * Ce script teste: * 1. Connexion SMTP * 2. Envoi d'un email simple * 3. Envoi avec le template complet */ require('dotenv').config(); const nodemailer = require('nodemailer'); console.log('\n🔍 DEBUG - Flux d\'envoi d\'email transporteur\n'); console.log('='.repeat(60)); // 1. Afficher la configuration console.log('\n📋 CONFIGURATION ACTUELLE:'); console.log('----------------------------'); console.log('SMTP_HOST:', process.env.SMTP_HOST); console.log('SMTP_PORT:', process.env.SMTP_PORT); console.log('SMTP_SECURE:', process.env.SMTP_SECURE); console.log('SMTP_USER:', process.env.SMTP_USER); console.log('SMTP_PASS:', process.env.SMTP_PASS ? '***' + process.env.SMTP_PASS.slice(-4) : 'NON DÉFINI'); console.log('SMTP_FROM:', process.env.SMTP_FROM); console.log('APP_URL:', process.env.APP_URL); // 2. Vérifier les variables requises console.log('\n✅ VÉRIFICATION DES VARIABLES:'); console.log('--------------------------------'); const requiredVars = ['SMTP_HOST', 'SMTP_PORT', 'SMTP_USER', 'SMTP_PASS']; const missing = requiredVars.filter(v => !process.env[v]); if (missing.length > 0) { console.error('❌ Variables manquantes:', missing.join(', ')); process.exit(1); } else { console.log('✅ Toutes les variables requises sont présentes'); } // 3. Créer le transporter avec la même configuration que le backend console.log('\n🔧 CRÉATION DU TRANSPORTER:'); console.log('----------------------------'); const host = process.env.SMTP_HOST; const port = parseInt(process.env.SMTP_PORT); const user = process.env.SMTP_USER; const pass = process.env.SMTP_PASS; const secure = process.env.SMTP_SECURE === 'true'; // Même logique que dans email.adapter.ts const useDirectIP = host.includes('mailtrap.io'); const actualHost = useDirectIP ? '3.209.246.195' : host; const serverName = useDirectIP ? 'smtp.mailtrap.io' : host; console.log('Configuration détectée:'); console.log(' Host original:', host); console.log(' Utilise IP directe:', useDirectIP); console.log(' Host réel:', actualHost); console.log(' Server name (TLS):', serverName); console.log(' Port:', port); console.log(' Secure:', secure); const transporter = nodemailer.createTransport({ host: actualHost, port, secure, auth: { user, pass, }, tls: { rejectUnauthorized: false, servername: serverName, }, connectionTimeout: 10000, greetingTimeout: 10000, socketTimeout: 30000, dnsTimeout: 10000, }); // 4. Tester la connexion console.log('\n🔌 TEST DE CONNEXION SMTP:'); console.log('---------------------------'); async function testConnection() { try { console.log('Vérification de la connexion...'); await transporter.verify(); console.log('✅ Connexion SMTP réussie!'); return true; } catch (error) { console.error('❌ Échec de la connexion SMTP:'); console.error(' Message:', error.message); console.error(' Code:', error.code); console.error(' Command:', error.command); if (error.stack) { console.error(' Stack:', error.stack.substring(0, 200) + '...'); } return false; } } // 5. Envoyer un email de test simple async function sendSimpleEmail() { console.log('\n📧 TEST 1: Email simple'); console.log('------------------------'); try { const info = await transporter.sendMail({ from: process.env.SMTP_FROM || 'noreply@xpeditis.com', to: 'test@example.com', subject: 'Test Simple - ' + new Date().toISOString(), text: 'Ceci est un test simple', html: '

Test Simple

Ceci est un test simple

', }); console.log('✅ Email simple envoyé avec succès!'); console.log(' Message ID:', info.messageId); console.log(' Response:', info.response); console.log(' Accepted:', info.accepted); console.log(' Rejected:', info.rejected); return true; } catch (error) { console.error('❌ Échec d\'envoi email simple:'); console.error(' Message:', error.message); console.error(' Code:', error.code); return false; } } // 6. Envoyer un email avec le template transporteur complet async function sendCarrierEmail() { console.log('\n📧 TEST 2: Email transporteur avec template'); console.log('--------------------------------------------'); const bookingData = { bookingId: 'TEST-' + Date.now(), origin: 'FRPAR', destination: 'USNYC', volumeCBM: 15.5, weightKG: 1200, palletCount: 6, priceUSD: 2500, priceEUR: 2250, primaryCurrency: 'USD', transitDays: 18, containerType: '40FT', documents: [ { type: 'Bill of Lading', fileName: 'bol-test.pdf' }, { type: 'Packing List', fileName: 'packing-test.pdf' }, { type: 'Commercial Invoice', fileName: 'invoice-test.pdf' }, ], }; const baseUrl = process.env.APP_URL || 'http://localhost:3000'; const acceptUrl = `${baseUrl}/api/v1/csv-bookings/${bookingData.bookingId}/accept`; const rejectUrl = `${baseUrl}/api/v1/csv-bookings/${bookingData.bookingId}/reject`; // Template HTML (version simplifiée pour le test) const htmlTemplate = ` Nouvelle demande de réservation

🚢 Nouvelle demande de réservation

Xpeditis

Bonjour,

Vous avez reçu une nouvelle demande de réservation via Xpeditis.

📋 Détails du transport

Route ${bookingData.origin} → ${bookingData.destination}
Volume ${bookingData.volumeCBM} CBM
Poids ${bookingData.weightKG} kg
Prix ${bookingData.priceUSD} USD

đź“„ Documents fournis

    ${bookingData.documents.map(doc => `
  • đź“„ ${doc.type}: ${doc.fileName}
  • `).join('')}

Veuillez confirmer votre décision :

âś“ Accepter la demande âś— Refuser la demande

⚠️ Important
Cette demande expire automatiquement dans 7 jours si aucune action n'est prise.

Référence de réservation : ${bookingData.bookingId}

© 2025 Xpeditis. Tous droits réservés.

Cet email a été envoyé automatiquement. Merci de ne pas y répondre directement.

`; try { console.log('Données du booking:'); console.log(' Booking ID:', bookingData.bookingId); console.log(' Route:', bookingData.origin, '→', bookingData.destination); console.log(' Prix:', bookingData.priceUSD, 'USD'); console.log(' Accept URL:', acceptUrl); console.log(' Reject URL:', rejectUrl); console.log('\nEnvoi en cours...'); const info = await transporter.sendMail({ from: process.env.SMTP_FROM || 'noreply@xpeditis.com', to: 'carrier@test.com', subject: `Nouvelle demande de réservation - ${bookingData.origin} → ${bookingData.destination}`, html: htmlTemplate, }); console.log('\n✅ Email transporteur envoyé avec succès!'); console.log(' Message ID:', info.messageId); console.log(' Response:', info.response); console.log(' Accepted:', info.accepted); console.log(' Rejected:', info.rejected); console.log('\n📬 Vérifiez votre inbox Mailtrap:'); console.log(' URL: https://mailtrap.io/inboxes'); console.log(' Sujet: Nouvelle demande de réservation - FRPAR → USNYC'); return true; } catch (error) { console.error('\n❌ Échec d\'envoi email transporteur:'); console.error(' Message:', error.message); console.error(' Code:', error.code); console.error(' ResponseCode:', error.responseCode); console.error(' Response:', error.response); if (error.stack) { console.error(' Stack:', error.stack.substring(0, 300)); } return false; } } // Exécuter tous les tests async function runAllTests() { console.log('\n🚀 DÉMARRAGE DES TESTS'); console.log('='.repeat(60)); // Test 1: Connexion const connectionOk = await testConnection(); if (!connectionOk) { console.log('\n❌ ARRÊT: La connexion SMTP a échoué'); console.log(' Vérifiez vos credentials SMTP dans .env'); process.exit(1); } // Test 2: Email simple const simpleEmailOk = await sendSimpleEmail(); if (!simpleEmailOk) { console.log('\n⚠️ L\'email simple a échoué, mais on continue...'); } // Test 3: Email transporteur const carrierEmailOk = await sendCarrierEmail(); // Résumé console.log('\n' + '='.repeat(60)); console.log('📊 RÉSUMÉ DES TESTS:'); console.log('='.repeat(60)); console.log('Connexion SMTP:', connectionOk ? '✅ OK' : '❌ ÉCHEC'); console.log('Email simple:', simpleEmailOk ? '✅ OK' : '❌ ÉCHEC'); console.log('Email transporteur:', carrierEmailOk ? '✅ OK' : '❌ ÉCHEC'); if (connectionOk && simpleEmailOk && carrierEmailOk) { console.log('\n✅ TOUS LES TESTS ONT RÉUSSI!'); console.log(' Le système d\'envoi d\'email fonctionne correctement.'); console.log(' Si vous ne recevez pas les emails dans le backend,'); console.log(' le problème vient de l\'intégration NestJS.'); } else { console.log('\n❌ CERTAINS TESTS ONT ÉCHOUÉ'); console.log(' Vérifiez les erreurs ci-dessus pour comprendre le problème.'); } console.log('\n' + '='.repeat(60)); } // Lancer les tests runAllTests() .then(() => { console.log('\n✅ Tests terminés\n'); process.exit(0); }) .catch(error => { console.error('\n❌ Erreur fatale:', error); process.exit(1); });