import React, { useEffect, useState } from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import TextField from '@mui/material/TextField'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import { getSettings, saveSettings } from '../../api/settings.js'; import { testSmtp } from '../../api/email.js'; import { showSnack } from '../snack.jsx'; /** 邮件配置:SMTP + 发件人信息 + 测试发送(迁移自 v1 邮件卡片) */ export default function EmailSettings() { const [form, setForm] = useState({ smtp_host: '', smtp_port: '587', smtp_user: '', smtp_pass: '', smtp_from_email: '', smtp_from_name: 'RainWeb', }); const [testEmail, setTestEmail] = useState(''); const [saving, setSaving] = useState(false); const [testing, setTesting] = useState(false); useEffect(() => { getSettings() .then((s) => setForm({ smtp_host: s.smtp_host || '', smtp_port: s.smtp_port || '587', smtp_user: s.smtp_user || '', smtp_pass: s.smtp_pass || '', smtp_from_email: s.smtp_from_email || '', smtp_from_name: s.smtp_from_name || 'RainWeb', })) .catch((e) => showSnack(e.message, 'error')); }, []); const set = (k) => (e) => setForm((p) => ({ ...p, [k]: e.target.value })); const save = async () => { setSaving(true); try { await saveSettings({ smtp_host: form.smtp_host.trim(), smtp_port: form.smtp_port, smtp_user: form.smtp_user.trim(), smtp_pass: form.smtp_pass, smtp_from_email: form.smtp_from_email.trim(), smtp_from_name: form.smtp_from_name.trim(), }); showSnack('邮件配置已保存'); } catch (e) { showSnack(e.message, 'error'); } setSaving(false); }; const test = async () => { if (!testEmail.trim()) { showSnack('请输入测试邮箱地址', 'error'); return; } setTesting(true); try { await testSmtp(testEmail.trim()); showSnack('测试邮件已发送至 ' + testEmail.trim()); } catch (e) { showSnack(e.message, 'error'); } setTesting(false); }; return ( 邮件配置 SMTP 服务器 发件人信息 setTestEmail(e.target.value)} placeholder="your@email.com" /> ); }