mirror of
https://github.com/beilunyang/moemail.git
synced 2025-12-24 11:30:51 +08:00
134 lines
3.2 KiB
TypeScript
134 lines
3.2 KiB
TypeScript
import { NextResponse } from "next/server"
|
||
import { auth } from "@/lib/auth"
|
||
import { createDb } from "@/lib/db"
|
||
import { emails, messages } from "@/lib/schema"
|
||
import { eq } from "drizzle-orm"
|
||
import { getRequestContext } from "@cloudflare/next-on-pages"
|
||
import { checkSendPermission } from "@/lib/send-permissions"
|
||
|
||
export const runtime = "edge"
|
||
|
||
interface SendEmailRequest {
|
||
to: string
|
||
subject: string
|
||
content: string
|
||
}
|
||
|
||
async function sendWithResend(
|
||
to: string,
|
||
subject: string,
|
||
content: string,
|
||
fromEmail: string,
|
||
config: { apiKey: string }
|
||
) {
|
||
const response = await fetch('https://api.resend.com/emails', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': `Bearer ${config.apiKey}`,
|
||
},
|
||
body: JSON.stringify({
|
||
from: fromEmail,
|
||
to: [to],
|
||
subject: subject,
|
||
html: content,
|
||
}),
|
||
})
|
||
|
||
if (!response.ok) {
|
||
const errorData = await response.json() as { message?: string }
|
||
console.error('Resend API error:', errorData)
|
||
throw new Error(errorData.message || "Resend发送失败,请稍后重试")
|
||
}
|
||
|
||
return { success: true }
|
||
}
|
||
|
||
export async function POST(
|
||
request: Request,
|
||
{ params }: { params: Promise<{ id: string }> }
|
||
) {
|
||
try {
|
||
const session = await auth()
|
||
if (!session?.user?.id) {
|
||
return NextResponse.json(
|
||
{ error: "未授权" },
|
||
{ status: 401 }
|
||
)
|
||
}
|
||
|
||
const { id } = await params
|
||
const db = createDb()
|
||
|
||
const permissionResult = await checkSendPermission(session.user.id)
|
||
if (!permissionResult.canSend) {
|
||
return NextResponse.json(
|
||
{ error: permissionResult.error },
|
||
{ status: 403 }
|
||
)
|
||
}
|
||
|
||
const remainingEmails = permissionResult.remainingEmails
|
||
|
||
const { to, subject, content } = await request.json() as SendEmailRequest
|
||
|
||
if (!to || !subject || !content) {
|
||
return NextResponse.json(
|
||
{ error: "收件人、主题和内容都是必填项" },
|
||
{ status: 400 }
|
||
)
|
||
}
|
||
|
||
const email = await db.query.emails.findFirst({
|
||
where: eq(emails.id, id)
|
||
})
|
||
|
||
if (!email) {
|
||
return NextResponse.json(
|
||
{ error: "邮箱不存在" },
|
||
{ status: 404 }
|
||
)
|
||
}
|
||
|
||
if (email.userId !== session.user.id) {
|
||
return NextResponse.json(
|
||
{ error: "无权访问此邮箱" },
|
||
{ status: 403 }
|
||
)
|
||
}
|
||
|
||
const env = getRequestContext().env
|
||
const apiKey = await env.SITE_CONFIG.get("RESEND_API_KEY")
|
||
|
||
if (!apiKey) {
|
||
return NextResponse.json(
|
||
{ error: "Resend 发件服务未配置,请联系管理员" },
|
||
{ status: 500 }
|
||
)
|
||
}
|
||
|
||
await sendWithResend(to, subject, content, email.address, { apiKey })
|
||
|
||
await db.insert(messages).values({
|
||
emailId: email.id,
|
||
fromAddress: email.address,
|
||
toAddress: to,
|
||
subject,
|
||
content: '',
|
||
type: "sent",
|
||
html: content
|
||
})
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
message: "邮件发送成功",
|
||
remainingEmails
|
||
})
|
||
} catch (error) {
|
||
console.error('Failed to send email:', error)
|
||
return NextResponse.json(
|
||
{ error: error instanceof Error ? error.message : "发送邮件失败" },
|
||
{ status: 500 }
|
||
)
|
||
}
|
||
}
|