212 lines
4.7 KiB
TypeScript
212 lines
4.7 KiB
TypeScript
|
/**
|
||
|
* 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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<ISmtpClientLogData>
|
||
|
): 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);
|
||
|
}
|