mirror of
https://github.com/beilunyang/moemail.git
synced 2026-09-04 14:56:37 +08:00
134 lines
3.2 KiB
TypeScript
134 lines
3.2 KiB
TypeScript
import { NextResponse } from "next/server"
|
|
import { getUserId } from "@/lib/apiKey"
|
|
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 userId = await getUserId()
|
|
if (!userId) {
|
|
return NextResponse.json(
|
|
{ error: "未授权" },
|
|
{ status: 401 }
|
|
)
|
|
}
|
|
|
|
const { id } = await params
|
|
const db = createDb()
|
|
|
|
const permissionResult = await checkSendPermission(userId)
|
|
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 !== userId) {
|
|
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 }
|
|
)
|
|
}
|
|
}
|