mail page connected with folders 5

This commit is contained in:
alma 2025-04-16 16:55:56 +02:00
parent 42a8c1dab8
commit 7cf49d8cf3

View File

@ -116,8 +116,19 @@ export async function GET() {
connTimeout: 30000 connTimeout: 30000
}); });
// Add a timeout to prevent hanging
const timeout = setTimeout(() => {
console.error('IMAP connection timeout');
imap.end();
resolve(NextResponse.json({
emails: [],
error: 'Connection timeout'
}));
}, 60000);
imap.once('error', (err: Error) => { imap.once('error', (err: Error) => {
console.error('IMAP error:', err); console.error('IMAP error:', err);
clearTimeout(timeout);
resolve(NextResponse.json({ resolve(NextResponse.json({
emails: [], emails: [],
error: 'IMAP connection error' error: 'IMAP connection error'
@ -128,6 +139,7 @@ export async function GET() {
imap.getBoxes((err, boxes) => { imap.getBoxes((err, boxes) => {
if (err) { if (err) {
console.error('Error getting mailboxes:', err); console.error('Error getting mailboxes:', err);
clearTimeout(timeout);
imap.end(); imap.end();
resolve(NextResponse.json({ emails: [], error: 'Failed to get mailboxes' })); resolve(NextResponse.json({ emails: [], error: 'Failed to get mailboxes' }));
return; return;
@ -143,6 +155,15 @@ export async function GET() {
// Process each mailbox // Process each mailbox
const foldersToProcess = availableMailboxes; const foldersToProcess = availableMailboxes;
let processedFolders = 0; let processedFolders = 0;
let activeFetches = 0;
function checkCompletion() {
processedFolders++;
if (processedFolders === foldersToProcess.length && activeFetches === 0) {
clearTimeout(timeout);
finishProcessing();
}
}
function finishProcessing() { function finishProcessing() {
// Combine all emails from all folders // Combine all emails from all folders
@ -169,10 +190,7 @@ export async function GET() {
imap.openBox(folderName, false, (err, box) => { imap.openBox(folderName, false, (err, box) => {
if (err) { if (err) {
console.error(`Error opening box ${folderName}:`, err); console.error(`Error opening box ${folderName}:`, err);
processedFolders++; checkCompletion();
if (processedFolders === foldersToProcess.length) {
finishProcessing();
}
return; return;
} }
@ -180,21 +198,16 @@ export async function GET() {
imap.search(['ALL'], (err, results) => { imap.search(['ALL'], (err, results) => {
if (err) { if (err) {
console.error(`Error searching in ${folderName}:`, err); console.error(`Error searching in ${folderName}:`, err);
processedFolders++; checkCompletion();
if (processedFolders === foldersToProcess.length) {
finishProcessing();
}
return; return;
} }
if (!results || results.length === 0) { if (!results || results.length === 0) {
processedFolders++; checkCompletion();
if (processedFolders === foldersToProcess.length) {
finishProcessing();
}
return; return;
} }
activeFetches++;
// Fetch emails // Fetch emails
const fetch = imap.fetch(results, { const fetch = imap.fetch(results, {
bodies: ['HEADER', 'TEXT'], bodies: ['HEADER', 'TEXT'],
@ -250,13 +263,13 @@ export async function GET() {
fetch.on('error', (err) => { fetch.on('error', (err) => {
console.error(`Error fetching emails from ${folderName}:`, err); console.error(`Error fetching emails from ${folderName}:`, err);
activeFetches--;
checkCompletion();
}); });
fetch.on('end', () => { fetch.on('end', () => {
processedFolders++; activeFetches--;
if (processedFolders === foldersToProcess.length) { checkCompletion();
finishProcessing();
}
}); });
}); });
}); });