/** * SMTP Client Logging Utilities * Client-side logging utilities for SMTP operations */ import { logger } from '../../../../logger.js'; import type { ISmtpResponse, ISmtpClientOptions } from '../interfaces.js'; export interface ISmtpClientLogData { component: string; host?: string; port?: number; secure?: boolean; command?: string; response?: ISmtpResponse; error?: Error; connectionId?: string; messageId?: string; duration?: number; [key: string]: any; } /** * Log SMTP client connection events */ export function logConnection( event: 'connecting' | 'connected' | 'disconnected' | 'error', options: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', event, host: options.host, port: options.port, secure: options.secure, ...data }; switch (event) { case 'connecting': logger.info('SMTP client connecting', logData); break; case 'connected': logger.info('SMTP client connected', logData); break; case 'disconnected': logger.info('SMTP client disconnected', logData); break; case 'error': logger.error('SMTP client connection error', logData); break; } } /** * Log SMTP command execution */ export function logCommand( command: string, response?: ISmtpResponse, options?: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', command, response, host: options?.host, port: options?.port, ...data }; if (response && response.code >= 400) { logger.warn('SMTP command failed', logData); } else { logger.debug('SMTP command executed', logData); } } /** * Log authentication events */ export function logAuthentication( event: 'start' | 'success' | 'failure', method: string, options: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', event: `auth_${event}`, authMethod: method, host: options.host, port: options.port, ...data }; switch (event) { case 'start': logger.debug('SMTP authentication started', logData); break; case 'success': logger.info('SMTP authentication successful', logData); break; case 'failure': logger.error('SMTP authentication failed', logData); break; } } /** * Log TLS/STARTTLS events */ export function logTLS( event: 'starttls_start' | 'starttls_success' | 'starttls_failure' | 'tls_connected', options: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', event, host: options.host, port: options.port, ...data }; if (event.includes('failure')) { logger.error('SMTP TLS operation failed', logData); } else { logger.info('SMTP TLS operation', logData); } } /** * Log email sending events */ export function logEmailSend( event: 'start' | 'success' | 'failure', recipients: string[], options: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', event: `send_${event}`, recipientCount: recipients.length, recipients: recipients.slice(0, 5), // Only log first 5 recipients for privacy host: options.host, port: options.port, ...data }; switch (event) { case 'start': logger.info('SMTP email send started', logData); break; case 'success': logger.info('SMTP email send successful', logData); break; case 'failure': logger.error('SMTP email send failed', logData); break; } } /** * Log performance metrics */ export function logPerformance( operation: string, duration: number, options: ISmtpClientOptions, data?: Partial ): void { const logData: ISmtpClientLogData = { component: 'smtp-client', operation, duration, host: options.host, port: options.port, ...data }; if (duration > 10000) { // Log slow operations (>10s) logger.warn('SMTP slow operation detected', logData); } else { logger.debug('SMTP operation performance', logData); } } /** * Log debug information (only when debug is enabled) */ export function logDebug( message: string, options: ISmtpClientOptions, data?: Partial ): void { if (!options.debug) { return; } const logData: ISmtpClientLogData = { component: 'smtp-client-debug', host: options.host, port: options.port, ...data }; logger.debug(`[SMTP Client Debug] ${message}`, logData); }