update
This commit is contained in:
@ -11,6 +11,8 @@ import {
|
||||
import { UnifiedDeliveryQueue, type IQueueItem } from './classes.delivery.queue.js';
|
||||
import type { Email } from '../core/classes.email.js';
|
||||
import type { IDomainRule } from '../routing/classes.email.config.js';
|
||||
import type { UnifiedEmailServer } from '../routing/classes.unified.email.server.js';
|
||||
import type { SmtpClient } from './smtpclient/smtp-client.js';
|
||||
|
||||
/**
|
||||
* Delivery status enumeration
|
||||
@ -109,16 +111,19 @@ export class MultiModeDeliverySystem extends EventEmitter {
|
||||
private throttled: boolean = false;
|
||||
private rateLimitLastCheck: number = Date.now();
|
||||
private rateLimitCounter: number = 0;
|
||||
private emailServer?: UnifiedEmailServer;
|
||||
|
||||
/**
|
||||
* Create a new multi-mode delivery system
|
||||
* @param queue Unified delivery queue
|
||||
* @param options Delivery options
|
||||
* @param emailServer Optional reference to unified email server for SmtpClient access
|
||||
*/
|
||||
constructor(queue: UnifiedDeliveryQueue, options: IMultiModeDeliveryOptions) {
|
||||
constructor(queue: UnifiedDeliveryQueue, options: IMultiModeDeliveryOptions, emailServer?: UnifiedEmailServer) {
|
||||
super();
|
||||
|
||||
this.queue = queue;
|
||||
this.emailServer = emailServer;
|
||||
|
||||
// Set default options
|
||||
this.options = {
|
||||
@ -442,6 +447,56 @@ export class MultiModeDeliverySystem extends EventEmitter {
|
||||
|
||||
logger.log('info', `Forwarding email to ${targetServer}:${targetPort}, TLS: ${useTls}`);
|
||||
|
||||
try {
|
||||
// Get SMTP client from email server if available
|
||||
if (!this.emailServer) {
|
||||
// Fall back to raw socket implementation if no email server
|
||||
logger.log('warn', 'No email server available, falling back to raw socket implementation');
|
||||
return this.handleForwardDeliveryLegacy(item);
|
||||
}
|
||||
|
||||
// Get or create SMTP client for the target server
|
||||
const smtpClient = this.emailServer.getSmtpClient(targetServer, targetPort);
|
||||
|
||||
// Send the email using SmtpClient
|
||||
const result = await smtpClient.sendMail(email);
|
||||
|
||||
if (result.success) {
|
||||
logger.log('info', `Email forwarded successfully to ${targetServer}:${targetPort}`);
|
||||
|
||||
return {
|
||||
targetServer: targetServer,
|
||||
targetPort: targetPort,
|
||||
recipients: result.acceptedRecipients.length,
|
||||
messageId: result.messageId,
|
||||
rejectedRecipients: result.rejectedRecipients
|
||||
};
|
||||
} else {
|
||||
throw new Error(result.error?.message || 'Failed to forward email');
|
||||
}
|
||||
} catch (error: any) {
|
||||
logger.log('error', `Failed to forward email: ${error.message}`);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Legacy forward delivery using raw sockets (fallback)
|
||||
* @param item Queue item
|
||||
*/
|
||||
private async handleForwardDeliveryLegacy(item: IQueueItem): Promise<any> {
|
||||
const email = item.processingResult as Email;
|
||||
const rule = item.rule;
|
||||
|
||||
// Get target server information
|
||||
const targetServer = rule.target?.server;
|
||||
const targetPort = rule.target?.port || 25;
|
||||
const useTls = rule.target?.useTls ?? false;
|
||||
|
||||
if (!targetServer) {
|
||||
throw new Error('No target server configured for forward mode');
|
||||
}
|
||||
|
||||
// Create a socket connection to the target server
|
||||
const socket = new net.Socket();
|
||||
|
||||
|
Reference in New Issue
Block a user