ded652382d
Each sendExportEmail call created a new nodemailer transport which was never closed, leaving the internal SMTP connection pool alive. With 3-retry backoff, up to 3 leaked transports per invoice accumulate over time and can exhaust OS socket limits. Add transport.close() in a finally block.