'use client'; import { useState, useEffect } from 'react'; import { SmtpSettings } from '@/types'; import { settingsService } from '@/lib/services'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Mail, Eye, EyeOff, TestTube, Save, CheckCircle, Send } from 'lucide-react'; import SendTestEmailModal from './SendTestEmailModal'; interface SmtpSettingsFormProps { onSave?: () => void; } export default function SmtpSettingsForm({ onSave }: SmtpSettingsFormProps) { const [settings, setSettings] = useState({ host: '', port: 587, username: '', password: '', secure: true, from_email: '', from_name: '' }); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); const [showPassword, setShowPassword] = useState(false); const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [showTestEmailModal, setShowTestEmailModal] = useState(false); const [passwordValue, setPasswordValue] = useState(''); useEffect(() => { loadSettings(); }, []); const loadSettings = async () => { try { setLoading(true); const smtpSettings = await settingsService.getSmtpSettings(); setSettings(smtpSettings); // Ne pas stocker le mot de passe en clair dans l'état local setPasswordValue(''); } catch (error) { console.error('Erreur lors du chargement des paramètres SMTP:', error); setMessage({ type: 'error', text: 'Erreur lors du chargement des paramètres' }); } finally { setLoading(false); } }; const handleInputChange = (field: keyof SmtpSettings, value: string | number | boolean) => { setSettings(prev => ({ ...prev, [field]: value })); // Si c'est le mot de passe, mettre à jour aussi l'état local if (field === 'password') { setPasswordValue(value as string); } }; const handleSave = async () => { try { setSaving(true); setMessage(null); // Utiliser le mot de passe saisi si disponible, sinon utiliser celui des settings const settingsToSave = { ...settings, password: passwordValue || settings.password }; await settingsService.setSmtpSettings(settingsToSave); setMessage({ type: 'success', text: 'Paramètres SMTP sauvegardés avec succès' }); onSave?.(); // Effacer le message après 3 secondes setTimeout(() => setMessage(null), 3000); } catch (error) { console.error('Erreur lors de la sauvegarde:', error); setMessage({ type: 'error', text: 'Erreur lors de la sauvegarde des paramètres' }); } finally { setSaving(false); } }; const handleTestConnection = async () => { try { setTesting(true); setMessage(null); // Utiliser le mot de passe saisi si disponible const settingsToTest = { ...settings, password: passwordValue || settings.password }; const result = await settingsService.testSmtpConnection(settingsToTest); if (result.success) { // Sauvegarder automatiquement les paramètres si le test réussit try { await settingsService.setSmtpSettings(settingsToTest); setMessage({ type: 'success', text: 'Test de connexion SMTP réussi ! Les paramètres ont été sauvegardés automatiquement.' }); onSave?.(); // Appeler le callback de sauvegarde } catch (saveError) { console.error('Erreur lors de la sauvegarde automatique:', saveError); setMessage({ type: 'success', text: 'Test de connexion SMTP réussi ! (Erreur lors de la sauvegarde automatique)' }); } } else { setMessage({ type: 'error', text: `Test de connexion échoué : ${result.error}` }); } } catch (error) { console.error('Erreur lors du test:', error); setMessage({ type: 'error', text: 'Erreur lors du test de connexion' }); } finally { setTesting(false); } }; if (loading) { return (
); } return ( <>
Configuration Email Paramètres SMTP pour l'envoi d'emails automatiques
{message && ( {message.text} )}
{/* Serveur SMTP */}
handleInputChange('host', e.target.value)} />
Exemples : smtp.gmail.com, smtp.office365.com, mail.infomaniak.com
{/* Port SMTP */}
handleInputChange('port', parseInt(e.target.value) || 587)} />
Ports courants : 587 (TLS), 465 (SSL), 25 (non sécurisé)
{/* Nom d'utilisateur */}
handleInputChange('username', e.target.value)} />
{/* Mot de passe */}
handleInputChange('password', e.target.value)} />
{passwordValue && (
Mot de passe saisi. Cliquez sur l'œil pour le voir.
)}
{/* Email d'expédition */}
handleInputChange('from_email', e.target.value)} />
{/* Nom d'expédition */}
handleInputChange('from_name', e.target.value)} />
{/* Connexion sécurisée */}

Activez cette option pour utiliser une connexion chiffrée SSL/TLS

handleInputChange('secure', checked)} className="ml-4" />
{/* Boutons d'action */}
{/* Informations de sécurité */}

🔒 Sécurité

Le mot de passe SMTP est automatiquement chiffré avant d'être stocké dans la base de données. Seules les personnes ayant accès à la clé de chiffrement peuvent le déchiffrer.

{/* Aide pour les configurations SMTP populaires */}

💡 Configurations SMTP populaires

Gmail
Serveur : smtp.gmail.com
Port : 587
SSL/TLS : Activé
Outlook/Hotmail
Serveur : smtp-mail.outlook.com
Port : 587
SSL/TLS : Activé
Yahoo
Serveur : smtp.mail.yahoo.com
Port : 587
SSL/TLS : Activé
Infomaniak
Serveur : mail.infomaniak.com
Port : 587
SSL/TLS : Activé
{/* Modal d'envoi d'email de test */} setShowTestEmailModal(false)} smtpSettings={{ ...settings, password: passwordValue || settings.password }} /> ); }