mirror of
https://github.com/beilunyang/moemail.git
synced 2025-10-05 07:26:54 +08:00
75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
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<void> {
|
|
await handleEmail(message, env)
|
|
}
|
|
}
|
|
|
|
export default worker
|