85 lines
3.2 KiB
TypeScript
85 lines
3.2 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { requireAdmin } from '@/lib/admin-auth';
|
|
import {
|
|
getEmailSettings,
|
|
getRequestBaseUrl,
|
|
publicEmailSettings,
|
|
renderEmailTemplate,
|
|
saveEmailSettings,
|
|
sendTemplatedEmail,
|
|
} from '@/lib/email-service';
|
|
import { getDbClient } from '@/storage/database/local-db';
|
|
|
|
export const runtime = 'nodejs';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const adminError = await requireAdmin(request);
|
|
if (adminError) return adminError;
|
|
|
|
const client = await getDbClient();
|
|
try {
|
|
const settings = await getEmailSettings(client);
|
|
const platformUrl = getRequestBaseUrl(request) || settings.appBaseUrl;
|
|
const preview = renderEmailTemplate(settings, {
|
|
title: '通知邮件模板预览',
|
|
intro: '这是一封由管理员发送给用户的通知邮件示例,用于预览全局通用邮件模板效果。',
|
|
body: '你可以在后台使用这套模板发送系统公告、功能更新、订单提醒、活动通知和安全提醒。实际发送时,标题、正文、按钮和备注会替换为管理员填写的内容。',
|
|
buttonText: '进入妙境',
|
|
buttonUrl: platformUrl,
|
|
note: '验证码邮件使用独立安全验证模板;管理员通知、管理员邮件和提醒邮件使用这套通用模板。',
|
|
templateKind: 'notification',
|
|
assetBaseUrl: platformUrl,
|
|
});
|
|
return NextResponse.json({ settings: publicEmailSettings(settings), preview });
|
|
} finally {
|
|
client.release();
|
|
}
|
|
}
|
|
|
|
export async function PUT(request: NextRequest) {
|
|
const adminError = await requireAdmin(request);
|
|
if (adminError) return adminError;
|
|
|
|
const client = await getDbClient();
|
|
try {
|
|
const body = await request.json();
|
|
const settings = await saveEmailSettings(client, body);
|
|
return NextResponse.json({ success: true, settings, message: '邮箱配置已保存' });
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : '邮箱配置保存失败';
|
|
return NextResponse.json({ error: message }, { status: 400 });
|
|
} finally {
|
|
client.release();
|
|
}
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
const adminError = await requireAdmin(request);
|
|
if (adminError) return adminError;
|
|
|
|
const client = await getDbClient();
|
|
try {
|
|
const body = await request.json();
|
|
const to = typeof body.to === 'string' ? body.to.trim() : '';
|
|
if (!to) {
|
|
return NextResponse.json({ error: '请填写测试收件邮箱' }, { status: 400 });
|
|
}
|
|
await sendTemplatedEmail(client, {
|
|
to,
|
|
type: 'business',
|
|
subject: '【妙境】邮箱配置测试',
|
|
title: '邮箱配置测试',
|
|
intro: '如果你收到这封邮件,说明自定义域名邮箱 SMTP 配置已生效。',
|
|
note: '请同时检查收件箱、垃圾箱,以及 SPF/DKIM/DMARC 解析状态。',
|
|
ipAddress: 'admin-test',
|
|
assetBaseUrl: getRequestBaseUrl(request) || undefined,
|
|
});
|
|
return NextResponse.json({ success: true, message: '测试邮件已发送' });
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : '测试邮件发送失败';
|
|
return NextResponse.json({ error: message }, { status: 400 });
|
|
} finally {
|
|
client.release();
|
|
}
|
|
}
|