refactoring majeur (code dupliqué, mort, ...)
- Économie : ~1240 lignes de code dupliqué - Réduction : ~60% du code modal - Amélioration : Cohérence et maintenabilité
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import * as nodemailer from 'nodemailer';
|
||||
import { SmtpSettings } from '@/types';
|
||||
import { validateSmtpSettings, validateEmail, createSmtpTransporterConfig } from '@/lib/smtp-utils';
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
try {
|
||||
@@ -15,8 +16,7 @@ export async function POST(request: NextRequest) {
|
||||
}
|
||||
|
||||
// Validation de l'email
|
||||
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||
if (!emailRegex.test(toEmail)) {
|
||||
if (!validateEmail(toEmail)) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: 'Adresse email de destination invalide' },
|
||||
{ status: 400 }
|
||||
@@ -24,31 +24,16 @@ export async function POST(request: NextRequest) {
|
||||
}
|
||||
|
||||
// Validation des paramètres SMTP
|
||||
if (!smtpSettings.host || !smtpSettings.port || !smtpSettings.username || !smtpSettings.password) {
|
||||
const validation = validateSmtpSettings(smtpSettings);
|
||||
if (!validation.isValid) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: 'Paramètres SMTP incomplets' },
|
||||
{ success: false, error: validation.error },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Créer le transporteur SMTP avec options de résolution DNS
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: smtpSettings.host,
|
||||
port: smtpSettings.port,
|
||||
secure: smtpSettings.secure, // true pour 465, false pour les autres ports
|
||||
auth: {
|
||||
user: smtpSettings.username,
|
||||
pass: smtpSettings.password,
|
||||
},
|
||||
// Options pour résoudre les problèmes DNS
|
||||
tls: {
|
||||
rejectUnauthorized: false, // Accepte les certificats auto-signés
|
||||
},
|
||||
// Timeout pour éviter les blocages
|
||||
connectionTimeout: 10000, // 10 secondes
|
||||
greetingTimeout: 10000,
|
||||
socketTimeout: 10000,
|
||||
});
|
||||
// Créer le transporteur SMTP
|
||||
const transporter = nodemailer.createTransport(createSmtpTransporterConfig(smtpSettings));
|
||||
|
||||
// Vérifier la connexion
|
||||
await transporter.verify();
|
||||
@@ -58,33 +43,7 @@ export async function POST(request: NextRequest) {
|
||||
from: `"${smtpSettings.from_name}" <${smtpSettings.from_email}>`,
|
||||
to: toEmail,
|
||||
subject: 'Test de configuration SMTP - Mes Budgets Participatifs',
|
||||
html: `
|
||||
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
|
||||
<h2 style="color: #2563eb;">✅ Test de configuration SMTP réussi !</h2>
|
||||
<p>Bonjour,</p>
|
||||
<p>Cet email confirme que votre configuration SMTP fonctionne correctement.</p>
|
||||
<div style="background-color: #f3f4f6; padding: 15px; border-radius: 8px; margin: 20px 0;">
|
||||
<h3 style="margin-top: 0;">Configuration utilisée :</h3>
|
||||
<ul style="margin: 0; padding-left: 20px;">
|
||||
<li><strong>Serveur :</strong> ${smtpSettings.host}:${smtpSettings.port}</li>
|
||||
<li><strong>Sécurisé :</strong> ${smtpSettings.secure ? 'Oui (SSL/TLS)' : 'Non'}</li>
|
||||
<li><strong>Utilisateur :</strong> ${smtpSettings.username}</li>
|
||||
<li><strong>Expéditeur :</strong> ${smtpSettings.from_name} <${smtpSettings.from_email}></li>
|
||||
</ul>
|
||||
</div>
|
||||
<p>Vous pouvez maintenant utiliser cette configuration pour envoyer des emails automatiques depuis votre application.</p>
|
||||
<hr style="border: none; border-top: 1px solid #e5e7eb; margin: 20px 0;">
|
||||
<p style="color: #6b7280; font-size: 12px;">
|
||||
Cet email a été envoyé automatiquement par Mes Budgets Participatifs pour tester la configuration SMTP.
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
text: `
|
||||
Test de configuration SMTP réussi !
|
||||
|
||||
Bonjour,
|
||||
|
||||
Cet email confirme que votre configuration SMTP fonctionne correctement.
|
||||
text: `Ceci est un email de test pour vérifier que votre configuration SMTP fonctionne correctement.
|
||||
|
||||
Configuration utilisée :
|
||||
- Serveur : ${smtpSettings.host}:${smtpSettings.port}
|
||||
@@ -92,42 +51,58 @@ Configuration utilisée :
|
||||
- Utilisateur : ${smtpSettings.username}
|
||||
- Expéditeur : ${smtpSettings.from_name} <${smtpSettings.from_email}>
|
||||
|
||||
Vous pouvez maintenant utiliser cette configuration pour envoyer des emails automatiques depuis votre application.
|
||||
Si vous recevez cet email, votre configuration SMTP est correcte !
|
||||
|
||||
---
|
||||
Cet email a été envoyé automatiquement par Mes Budgets Participatifs pour tester la configuration SMTP.
|
||||
Cordialement,
|
||||
L'équipe Mes Budgets Participatifs`,
|
||||
html: `
|
||||
<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
|
||||
<h2 style="color: #2563eb;">Test de configuration SMTP</h2>
|
||||
<p>Ceci est un email de test pour vérifier que votre configuration SMTP fonctionne correctement.</p>
|
||||
|
||||
<div style="background-color: #f8fafc; padding: 15px; border-radius: 8px; margin: 20px 0;">
|
||||
<h3 style="margin-top: 0; color: #374151;">Configuration utilisée :</h3>
|
||||
<ul style="color: #6b7280;">
|
||||
<li><strong>Serveur :</strong> ${smtpSettings.host}:${smtpSettings.port}</li>
|
||||
<li><strong>Sécurisé :</strong> ${smtpSettings.secure ? 'Oui (SSL/TLS)' : 'Non'}</li>
|
||||
<li><strong>Utilisateur :</strong> ${smtpSettings.username}</li>
|
||||
<li><strong>Expéditeur :</strong> ${smtpSettings.from_name} <${smtpSettings.from_email}></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<p style="color: #059669; font-weight: bold;">✅ Si vous recevez cet email, votre configuration SMTP est correcte !</p>
|
||||
|
||||
<hr style="border: none; border-top: 1px solid #e5e7eb; margin: 20px 0;">
|
||||
<p style="color: #6b7280; font-size: 14px;">
|
||||
Cordialement,<br>
|
||||
L'équipe Mes Budgets Participatifs
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
message: 'Email de test envoyé avec succès',
|
||||
messageId: info.messageId
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
} catch (error: any) {
|
||||
console.error('Erreur lors de l\'envoi de l\'email de test:', error);
|
||||
|
||||
let errorMessage = 'Erreur lors de l\'envoi de l\'email';
|
||||
let errorMessage = 'Erreur lors de l\'envoi de l\'email de test';
|
||||
|
||||
if (error instanceof Error) {
|
||||
if (error.message.includes('EBADNAME')) {
|
||||
errorMessage = 'Impossible de résoudre le nom d\'hôte SMTP. Vérifiez que le serveur SMTP est correct.';
|
||||
} else if (error.message.includes('ECONNREFUSED')) {
|
||||
errorMessage = 'Connexion refusée. Vérifiez le serveur et le port SMTP.';
|
||||
} else if (error.message.includes('ETIMEDOUT')) {
|
||||
errorMessage = 'Délai d\'attente dépassé. Vérifiez votre connexion internet et les paramètres SMTP.';
|
||||
} else if (error.message.includes('EAUTH')) {
|
||||
errorMessage = 'Authentification échouée. Vérifiez le nom d\'utilisateur et le mot de passe.';
|
||||
} else {
|
||||
errorMessage = error.message;
|
||||
}
|
||||
if (error.code === 'EAUTH') {
|
||||
errorMessage = 'Authentification SMTP échouée. Vérifiez vos identifiants.';
|
||||
} else if (error.code === 'ECONNECTION') {
|
||||
errorMessage = 'Impossible de se connecter au serveur SMTP. Vérifiez l\'hôte et le port.';
|
||||
} else if (error.code === 'ETIMEDOUT') {
|
||||
errorMessage = 'Connexion SMTP expirée. Vérifiez vos paramètres réseau.';
|
||||
} else if (error.message) {
|
||||
errorMessage = error.message;
|
||||
}
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
error: errorMessage
|
||||
},
|
||||
{ success: false, error: errorMessage },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import * as nodemailer from 'nodemailer';
|
||||
import { SmtpSettings } from '@/types';
|
||||
import { validateSmtpSettings, createSmtpTransporterConfig } from '@/lib/smtp-utils';
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
try {
|
||||
@@ -15,47 +16,16 @@ export async function POST(request: NextRequest) {
|
||||
}
|
||||
|
||||
// Validation des paramètres SMTP
|
||||
if (!smtpSettings.host || !smtpSettings.port || !smtpSettings.username || !smtpSettings.password) {
|
||||
const validation = validateSmtpSettings(smtpSettings);
|
||||
if (!validation.isValid) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: 'Paramètres SMTP incomplets' },
|
||||
{ success: false, error: validation.error },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Validation du port
|
||||
if (smtpSettings.port < 1 || smtpSettings.port > 65535) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: 'Port SMTP invalide' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Validation de l'email d'expédition
|
||||
if (!smtpSettings.from_email.includes('@')) {
|
||||
return NextResponse.json(
|
||||
{ success: false, error: 'Adresse email d\'expédition invalide' },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Créer le transporteur SMTP avec options de résolution DNS
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: smtpSettings.host,
|
||||
port: smtpSettings.port,
|
||||
secure: smtpSettings.secure, // true pour 465, false pour les autres ports
|
||||
auth: {
|
||||
user: smtpSettings.username,
|
||||
pass: smtpSettings.password,
|
||||
},
|
||||
// Options pour résoudre les problèmes DNS
|
||||
tls: {
|
||||
rejectUnauthorized: false, // Accepte les certificats auto-signés
|
||||
},
|
||||
// Timeout pour éviter les blocages
|
||||
connectionTimeout: 10000, // 10 secondes
|
||||
greetingTimeout: 10000,
|
||||
socketTimeout: 10000,
|
||||
});
|
||||
// Créer le transporteur SMTP
|
||||
const transporter = nodemailer.createTransport(createSmtpTransporterConfig(smtpSettings));
|
||||
|
||||
// Vérifier la connexion
|
||||
await transporter.verify();
|
||||
@@ -64,31 +34,23 @@ export async function POST(request: NextRequest) {
|
||||
success: true,
|
||||
message: 'Connexion SMTP réussie'
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Erreur lors du test de connexion SMTP:', error);
|
||||
} catch (error: any) {
|
||||
console.error('Erreur lors du test SMTP:', error);
|
||||
|
||||
let errorMessage = 'Erreur de connexion SMTP';
|
||||
let errorMessage = 'Erreur lors du test de connexion SMTP';
|
||||
|
||||
if (error instanceof Error) {
|
||||
if (error.message.includes('EBADNAME')) {
|
||||
errorMessage = 'Impossible de résoudre le nom d\'hôte SMTP. Vérifiez que le serveur SMTP est correct.';
|
||||
} else if (error.message.includes('ECONNREFUSED')) {
|
||||
errorMessage = 'Connexion refusée. Vérifiez le serveur et le port SMTP.';
|
||||
} else if (error.message.includes('ETIMEDOUT')) {
|
||||
errorMessage = 'Délai d\'attente dépassé. Vérifiez votre connexion internet et les paramètres SMTP.';
|
||||
} else if (error.message.includes('EAUTH')) {
|
||||
errorMessage = 'Authentification échouée. Vérifiez le nom d\'utilisateur et le mot de passe.';
|
||||
} else {
|
||||
errorMessage = error.message;
|
||||
}
|
||||
if (error.code === 'EAUTH') {
|
||||
errorMessage = 'Authentification SMTP échouée. Vérifiez vos identifiants.';
|
||||
} else if (error.code === 'ECONNECTION') {
|
||||
errorMessage = 'Impossible de se connecter au serveur SMTP. Vérifiez l\'hôte et le port.';
|
||||
} else if (error.code === 'ETIMEDOUT') {
|
||||
errorMessage = 'Connexion SMTP expirée. Vérifiez vos paramètres réseau.';
|
||||
} else if (error.message) {
|
||||
errorMessage = error.message;
|
||||
}
|
||||
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
error: errorMessage
|
||||
},
|
||||
{ success: false, error: errorMessage },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user