291 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			291 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | /** | ||
|  |  * SMTP and email delivery interface definitions | ||
|  |  */ | ||
|  | 
 | ||
|  | import type { Email } from '../core/classes.email.ts'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * SMTP session state enumeration | ||
|  |  */ | ||
|  | export enum SmtpState { | ||
|  |   GREETING = 'GREETING', | ||
|  |   AFTER_EHLO = 'AFTER_EHLO', | ||
|  |   MAIL_FROM = 'MAIL_FROM', | ||
|  |   RCPT_TO = 'RCPT_TO', | ||
|  |   DATA = 'DATA', | ||
|  |   DATA_RECEIVING = 'DATA_RECEIVING', | ||
|  |   FINISHED = 'FINISHED' | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Email processing mode type | ||
|  |  */ | ||
|  | export type EmailProcessingMode = 'forward' | 'mta' | 'process'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Envelope recipient information | ||
|  |  */ | ||
|  | export interface IEnvelopeRecipient { | ||
|  |   /** | ||
|  |    * Email address of the recipient | ||
|  |    */ | ||
|  |   address: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Additional SMTP command arguments | ||
|  |    */ | ||
|  |   args: Record<string, string>; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * SMTP session envelope information | ||
|  |  */ | ||
|  | export interface ISmtpEnvelope { | ||
|  |   /** | ||
|  |    * Envelope sender (MAIL FROM) information | ||
|  |    */ | ||
|  |   mailFrom: { | ||
|  |     /** | ||
|  |      * Email address of the sender | ||
|  |      */ | ||
|  |     address: string; | ||
|  |      | ||
|  |     /** | ||
|  |      * Additional SMTP command arguments | ||
|  |      */ | ||
|  |     args: Record<string, string>; | ||
|  |   }; | ||
|  |    | ||
|  |   /** | ||
|  |    * Envelope recipients (RCPT TO) information | ||
|  |    */ | ||
|  |   rcptTo: IEnvelopeRecipient[]; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * SMTP Session interface - represents an active SMTP connection | ||
|  |  */ | ||
|  | export interface ISmtpSession { | ||
|  |   /** | ||
|  |    * Unique session identifier | ||
|  |    */ | ||
|  |   id: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Current session state in the SMTP conversation | ||
|  |    */ | ||
|  |   state: SmtpState; | ||
|  |    | ||
|  |   /** | ||
|  |    * Hostname provided by the client in EHLO/HELO command | ||
|  |    */ | ||
|  |   clientHostname: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * MAIL FROM email address (legacy format) | ||
|  |    */ | ||
|  |   mailFrom: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * RCPT TO email addresses (legacy format) | ||
|  |    */ | ||
|  |   rcptTo: string[]; | ||
|  |    | ||
|  |   /** | ||
|  |    * Raw email data being received | ||
|  |    */ | ||
|  |   emailData: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Chunks of email data for more efficient buffer management | ||
|  |    */ | ||
|  |   emailDataChunks?: string[]; | ||
|  |    | ||
|  |   /** | ||
|  |    * Whether the connection is using TLS | ||
|  |    */ | ||
|  |   useTLS: boolean; | ||
|  |    | ||
|  |   /** | ||
|  |    * Whether the connection has ended | ||
|  |    */ | ||
|  |   connectionEnded: boolean; | ||
|  |    | ||
|  |   /** | ||
|  |    * Remote IP address of the client | ||
|  |    */ | ||
|  |   remoteAddress: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Whether the connection is secure (TLS) | ||
|  |    */ | ||
|  |   secure: boolean; | ||
|  |    | ||
|  |   /** | ||
|  |    * Whether the client has been authenticated | ||
|  |    */ | ||
|  |   authenticated: boolean; | ||
|  |    | ||
|  |   /** | ||
|  |    * SMTP envelope information (structured format) | ||
|  |    */ | ||
|  |   envelope: ISmtpEnvelope; | ||
|  |    | ||
|  |   /** | ||
|  |    * Email processing mode to use for this session | ||
|  |    */ | ||
|  |   processingMode?: EmailProcessingMode; | ||
|  |    | ||
|  |   /** | ||
|  |    * Timestamp of last activity for session timeout tracking | ||
|  |    */ | ||
|  |   lastActivity?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Timeout ID for DATA command timeout | ||
|  |    */ | ||
|  |   dataTimeoutId?: NodeJS.Timeout; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * SMTP authentication data | ||
|  |  */ | ||
|  | export interface ISmtpAuth { | ||
|  |   /** | ||
|  |    * Authentication method used | ||
|  |    */ | ||
|  |   method: 'PLAIN' | 'LOGIN' | 'OAUTH2' | string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Username for authentication | ||
|  |    */ | ||
|  |   username: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Password or token for authentication | ||
|  |    */ | ||
|  |   password: string; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * SMTP server options | ||
|  |  */ | ||
|  | export interface ISmtpServerOptions { | ||
|  |   /** | ||
|  |    * Port to listen on | ||
|  |    */ | ||
|  |   port: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * TLS private key (PEM format) | ||
|  |    */ | ||
|  |   key: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * TLS certificate (PEM format) | ||
|  |    */ | ||
|  |   cert: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Server hostname for SMTP banner | ||
|  |    */ | ||
|  |   hostname?: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Host address to bind to (defaults to all interfaces) | ||
|  |    */ | ||
|  |   host?: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Secure port for dedicated TLS connections | ||
|  |    */ | ||
|  |   securePort?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * CA certificates for TLS (PEM format) | ||
|  |    */ | ||
|  |   ca?: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Maximum size of messages in bytes | ||
|  |    */ | ||
|  |   maxSize?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Maximum number of concurrent connections | ||
|  |    */ | ||
|  |   maxConnections?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Authentication options | ||
|  |    */ | ||
|  |   auth?: { | ||
|  |     /** | ||
|  |      * Whether authentication is required | ||
|  |      */ | ||
|  |     required: boolean; | ||
|  |      | ||
|  |     /** | ||
|  |      * Allowed authentication methods | ||
|  |      */ | ||
|  |     methods: ('PLAIN' | 'LOGIN' | 'OAUTH2')[]; | ||
|  |   }; | ||
|  |    | ||
|  |   /** | ||
|  |    * Socket timeout in milliseconds (default: 5 minutes / 300000ms) | ||
|  |    */ | ||
|  |   socketTimeout?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Initial connection timeout in milliseconds (default: 30 seconds / 30000ms) | ||
|  |    */ | ||
|  |   connectionTimeout?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Interval for checking idle sessions in milliseconds (default: 5 seconds / 5000ms) | ||
|  |    * For testing, can be set lower (e.g. 1000ms) to detect timeouts more quickly | ||
|  |    */ | ||
|  |   cleanupInterval?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Maximum number of recipients allowed per message (default: 100) | ||
|  |    */ | ||
|  |   maxRecipients?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Maximum message size in bytes (default: 10MB / 10485760 bytes) | ||
|  |    * This is advertised in the EHLO SIZE extension | ||
|  |    */ | ||
|  |   size?: number; | ||
|  |    | ||
|  |   /** | ||
|  |    * Timeout for the DATA command in milliseconds (default: 60000ms / 1 minute) | ||
|  |    * This controls how long to wait for the complete email data | ||
|  |    */ | ||
|  |   dataTimeout?: number; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Result of SMTP transaction | ||
|  |  */ | ||
|  | export interface ISmtpTransactionResult { | ||
|  |   /** | ||
|  |    * Whether the transaction was successful | ||
|  |    */ | ||
|  |   success: boolean; | ||
|  |    | ||
|  |   /** | ||
|  |    * Error message if failed | ||
|  |    */ | ||
|  |   error?: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Message ID if successful | ||
|  |    */ | ||
|  |   messageId?: string; | ||
|  |    | ||
|  |   /** | ||
|  |    * Resulting email if successful | ||
|  |    */ | ||
|  |   email?: Email; | ||
|  | } |