import { Env } from '../types' import { drizzle } from 'drizzle-orm/d1' import { messages, emails, webhooks } from '../app/lib/schema' import { eq, sql } from 'drizzle-orm' import PostalMime from 'postal-mime' import { WEBHOOK_CONFIG } from '../app/config/webhook' import { EmailMessage } from '../app/lib/webhook' const handleEmail = async (message: ForwardableEmailMessage, env: Env) => { const db = drizzle(env.DB, { schema: { messages, emails, webhooks } }) const parsedMessage = await PostalMime.parse(message.raw) console.log("parsedMessage:", parsedMessage) try { const targetEmail = await db.query.emails.findFirst({ where: eq(sql`LOWER(${emails.address})`, message.to.toLowerCase()) }) if (!targetEmail) { console.error(`Email not found: ${message.to}`) return } const savedMessage = await db.insert(messages).values({ emailId: targetEmail.id, fromAddress: message.from, subject: parsedMessage.subject || '(无主题)', content: parsedMessage.text || '', html: parsedMessage.html || '', type: 'received', }).returning().get() const webhook = await db.query.webhooks.findFirst({ where: eq(webhooks.userId, targetEmail!.userId!) }) if (webhook?.enabled) { try { await fetch(webhook.url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Webhook-Event': WEBHOOK_CONFIG.EVENTS.NEW_MESSAGE }, body: JSON.stringify({ emailId: targetEmail.id, messageId: savedMessage.id, fromAddress: savedMessage.fromAddress, subject: savedMessage.subject, content: savedMessage.content, html: savedMessage.html, receivedAt: savedMessage.receivedAt.toISOString(), toAddress: targetEmail.address } as EmailMessage) }) } catch (error) { console.error('Failed to send webhook:', error) } } console.log(`Email processed: ${parsedMessage.subject}`) } catch (error) { console.error('Failed to process email:', error) } } const worker = { async email(message: ForwardableEmailMessage, env: Env): Promise { await handleEmail(message, env) } } export default worker