/** * Test script for TNEF (winmail.dat) parser. * * Usage: * npx tsx scripts/test-tnef.ts * * Outputs: * - tnef-output.html (HTML body or formatted plain text) * - Any extracted attachments saved alongside */ import { readFileSync, writeFileSync } from 'fs'; import { resolve, basename } from 'path'; import { parseTnef } from '../lib/tnef'; const inputPath = process.argv[2]; if (!inputPath) { console.error('Usage: npx tsx scripts/test-tnef.ts '); process.exit(1); } const fullPath = resolve(inputPath); console.log(`Reading: ${fullPath}`); const data = new Uint8Array(readFileSync(fullPath)); console.log(`File size: ${data.byteLength} bytes`); const result = parseTnef(data); console.log(`\n=== TNEF Parse Results ===`); console.log(`Plain text body: ${result.body ? `${result.body.length} chars` : 'none'}`); console.log(`HTML body: ${result.htmlBody ? `${result.htmlBody.length} chars` : 'none'}`); console.log(`Attachments: ${result.attachments.length}`); if (result.attachments.length > 0) { console.log(`\nAttachments:`); result.attachments.forEach((att, i) => { console.log(` [${i + 1}] ${att.name} (${att.mimeType}, ${att.data.byteLength} bytes)`); }); } // Build output HTML let htmlContent: string; const attachmentsList = result.attachments.length > 0 ? `

Extracted Attachments (${result.attachments.length})

${result.attachments.map((att, i) => ``).join('\n')}
#NameMIME TypeSize
${i+1}${att.name}${att.mimeType}${att.data.byteLength} bytes
` : '

No attachments found.

'; if (result.htmlBody) { htmlContent = ` TNEF Output

TNEF Parse Results

Source: ${inputPath} (${data.byteLength} bytes)

${attachmentsList}

HTML Body

${result.htmlBody}
`; } else if (result.body) { const escaped = result.body .replace(/&/g, '&') .replace(//g, '>'); htmlContent = ` TNEF Output

TNEF Parse Results

Source: ${inputPath} (${data.byteLength} bytes)

${attachmentsList}

Plain Text Body

${escaped}
`; } else { htmlContent = ` TNEF Output

TNEF Parse Results

Source: ${inputPath} (${data.byteLength} bytes)

No body content found in this TNEF file. The email body is likely in the regular MIME text/plain part.

${attachmentsList} `; } const outputHtml = resolve('tnef-output.html'); writeFileSync(outputHtml, htmlContent, 'utf-8'); console.log(`\nSaved HTML: ${outputHtml}`); // Save extracted attachments result.attachments.forEach((att, i) => { const attPath = resolve(`tnef-attachment-${i + 1}-${att.name}`); writeFileSync(attPath, att.data); console.log(`Saved attachment: ${attPath}`); }); console.log('\nDone.');