From ecb308d9fb8dff587eedd3513d14a93be407422d Mon Sep 17 00:00:00 2001 From: alma Date: Fri, 25 Apr 2025 12:41:58 +0200 Subject: [PATCH] panel 2 courier api --- app/api/courrier/route.ts | 65 ++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/app/api/courrier/route.ts b/app/api/courrier/route.ts index a844120b..5ae450fb 100644 --- a/app/api/courrier/route.ts +++ b/app/api/courrier/route.ts @@ -4,22 +4,6 @@ import { getServerSession } from 'next-auth'; import { authOptions } from '@/app/api/auth/[...nextauth]/route'; import { prisma } from '@/lib/prisma'; -// Define the Email type -interface Email { - id: string; - from: string; - fromName: string; - to: string; - subject: string; - date: string; - read: boolean; - starred: boolean; - folder: string; - hasAttachments: boolean; - flags: string[]; - preview?: string; -} - // Add caching for better performance const cache = new Map(); @@ -49,23 +33,32 @@ export async function GET(request: Request) { ); } + // Get credentials from database const credentials = await prisma.mailCredentials.findUnique({ - where: { userId: session.user.id } + where: { + userId: session.user.id + } }); if (!credentials) { return NextResponse.json( - { error: 'No mail credentials found' }, + { error: 'No mail credentials found. Please configure your email account.' }, { status: 401 } ); } + // Get query parameters const url = new URL(request.url); const folder = url.searchParams.get('folder') || 'INBOX'; const page = parseInt(url.searchParams.get('page') || '1'); const limit = parseInt(url.searchParams.get('limit') || '20'); const preview = url.searchParams.get('preview') === 'true'; + // Calculate start and end sequence numbers + const start = (page - 1) * limit + 1; + const end = start + limit - 1; + + // Connect to IMAP server const client = new ImapFlow({ host: credentials.host, port: credentials.port, @@ -76,46 +69,50 @@ export async function GET(request: Request) { }, logger: false, emitLogs: false, - tls: { rejectUnauthorized: false } + tls: { + rejectUnauthorized: false + } }); try { await client.connect(); + // Get list of all mailboxes first const mailboxes = await client.list(); const availableFolders = mailboxes.map(box => box.path); + // Open the requested mailbox const mailbox = await client.mailboxOpen(folder); - const start = (page - 1) * limit + 1; - const end = start + limit - 1; - - const result: Email[] = []; + const result = []; + // Only try to fetch if the mailbox has messages if (mailbox.exists > 0) { + // Adjust start and end to be within bounds const adjustedStart = Math.min(start, mailbox.exists); const adjustedEnd = Math.min(end, mailbox.exists); + // Fetch both metadata and preview content const messages = await client.fetch(`${adjustedStart}:${adjustedEnd}`, { envelope: true, flags: true, bodyStructure: true, + // Only fetch preview content if requested ...(preview ? { bodyParts: ['TEXT'], bodyPartsOptions: { TEXT: { - maxLength: 1000 + maxLength: 1000 // Limit preview length } } } : {}) }); for await (const message of messages) { - const email: Email = { - id: message.uid.toString(), + result.push({ + id: message.uid, from: message.envelope.from?.[0]?.address || '', - fromName: message.envelope.from?.[0]?.name || - message.envelope.from?.[0]?.address?.split('@')[0] || '', + fromName: message.envelope.from?.[0]?.name || message.envelope.from?.[0]?.address?.split('@')[0] || '', to: message.envelope.to?.map(addr => addr.address).join(', ') || '', subject: message.envelope.subject || '(No subject)', date: message.envelope.date?.toISOString() || new Date().toISOString(), @@ -124,9 +121,9 @@ export async function GET(request: Request) { folder: mailbox.path, hasAttachments: message.bodyStructure?.type === 'multipart', flags: Array.from(message.flags), - preview: preview ? message.bodyParts?.get('TEXT')?.toString() : undefined - }; - result.push(email); + // Include preview content if available + preview: preview ? message.bodyParts?.TEXT?.toString() : null + }); } } @@ -137,7 +134,11 @@ export async function GET(request: Request) { hasMore: end < mailbox.exists }); } finally { - await client.logout(); + try { + await client.logout(); + } catch (e) { + console.error('Error during logout:', e); + } } } catch (error) { console.error('Error in courrier route:', error);