Files
moemail/app/api/emails/[id]/send/route.ts

134 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 }
)
}
}